ccxt-go/bitget.go
zhangkun9038@dingtalk.com 1a2ce7046a first add
2025-02-28 10:33:20 +08:00

10694 lines
494 KiB
Go

package ccxt
// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
type bitget struct {
Exchange
}
func NewBitgetCore() bitget {
p := bitget{}
setDefaults(&p)
return p
}
func (this *bitget) Describe() interface{} {
return this.DeepExtend(this.Exchange.Describe(), map[string]interface{} {
"id": "bitget",
"name": "Bitget",
"countries": []interface{}{"SG"},
"version": "v2",
"rateLimit": 50,
"certified": true,
"pro": true,
"has": map[string]interface{} {
"CORS": nil,
"spot": true,
"margin": true,
"swap": true,
"future": true,
"option": false,
"addMargin": true,
"borrowCrossMargin": true,
"borrowIsolatedMargin": true,
"cancelAllOrders": true,
"cancelOrder": true,
"cancelOrders": true,
"closeAllPositions": true,
"closePosition": true,
"createConvertTrade": true,
"createDepositAddress": false,
"createMarketBuyOrderWithCost": true,
"createMarketOrderWithCost": false,
"createMarketSellOrderWithCost": false,
"createOrder": true,
"createOrders": true,
"createOrderWithTakeProfitAndStopLoss": true,
"createPostOnlyOrder": true,
"createReduceOnlyOrder": false,
"createStopLimitOrder": true,
"createStopLossOrder": true,
"createStopMarketOrder": true,
"createStopOrder": true,
"createTakeProfitOrder": true,
"createTrailingAmountOrder": false,
"createTrailingPercentOrder": true,
"createTriggerOrder": true,
"editOrder": true,
"fetchAccounts": false,
"fetchBalance": true,
"fetchBorrowInterest": true,
"fetchBorrowRateHistories": false,
"fetchBorrowRateHistory": false,
"fetchCanceledAndClosedOrders": true,
"fetchCanceledOrders": true,
"fetchClosedOrders": true,
"fetchConvertCurrencies": true,
"fetchConvertQuote": true,
"fetchConvertTrade": false,
"fetchConvertTradeHistory": true,
"fetchCrossBorrowRate": true,
"fetchCrossBorrowRates": false,
"fetchCurrencies": true,
"fetchDeposit": false,
"fetchDepositAddress": true,
"fetchDepositAddresses": false,
"fetchDepositAddressesByNetwork": false,
"fetchDeposits": true,
"fetchDepositsWithdrawals": false,
"fetchDepositWithdrawFee": "emulated",
"fetchDepositWithdrawFees": true,
"fetchFundingHistory": true,
"fetchFundingInterval": true,
"fetchFundingIntervals": false,
"fetchFundingRate": true,
"fetchFundingRateHistory": true,
"fetchFundingRates": true,
"fetchIndexOHLCV": true,
"fetchIsolatedBorrowRate": true,
"fetchIsolatedBorrowRates": false,
"fetchLedger": true,
"fetchLeverage": true,
"fetchLeverageTiers": false,
"fetchLiquidations": false,
"fetchLongShortRatio": false,
"fetchLongShortRatioHistory": true,
"fetchMarginAdjustmentHistory": false,
"fetchMarginMode": true,
"fetchMarketLeverageTiers": true,
"fetchMarkets": true,
"fetchMarkOHLCV": true,
"fetchMarkPrice": true,
"fetchMyLiquidations": true,
"fetchMyTrades": true,
"fetchOHLCV": true,
"fetchOpenInterest": true,
"fetchOpenInterestHistory": false,
"fetchOpenOrders": true,
"fetchOrder": true,
"fetchOrderBook": true,
"fetchOrderBooks": false,
"fetchOrders": false,
"fetchOrderTrades": false,
"fetchPosition": true,
"fetchPositionHistory": "emulated",
"fetchPositionMode": false,
"fetchPositions": true,
"fetchPositionsHistory": true,
"fetchPositionsRisk": false,
"fetchPremiumIndexOHLCV": false,
"fetchStatus": false,
"fetchTicker": true,
"fetchTickers": true,
"fetchTime": true,
"fetchTrades": true,
"fetchTradingFee": true,
"fetchTradingFees": true,
"fetchTransactions": false,
"fetchTransfer": false,
"fetchTransfers": true,
"fetchWithdrawAddresses": false,
"fetchWithdrawal": false,
"fetchWithdrawals": true,
"reduceMargin": true,
"repayCrossMargin": true,
"repayIsolatedMargin": true,
"setLeverage": true,
"setMargin": false,
"setMarginMode": true,
"setPositionMode": true,
"signIn": false,
"transfer": true,
"withdraw": true,
},
"timeframes": map[string]interface{} {
"1m": "1m",
"3m": "3m",
"5m": "5m",
"15m": "15m",
"30m": "30m",
"1h": "1h",
"2h": "2h",
"4h": "4h",
"6h": "6h",
"12h": "12h",
"1d": "1d",
"3d": "3d",
"1w": "1w",
"1M": "1m",
},
"hostname": "bitget.com",
"urls": map[string]interface{} {
"logo": "https://github.com/user-attachments/assets/fbaa10cc-a277-441d-a5b7-997dd9a87658",
"api": map[string]interface{} {
"spot": "https://api.{hostname}",
"mix": "https://api.{hostname}",
"user": "https://api.{hostname}",
"p2p": "https://api.{hostname}",
"broker": "https://api.{hostname}",
"margin": "https://api.{hostname}",
"common": "https://api.{hostname}",
"tax": "https://api.{hostname}",
"convert": "https://api.{hostname}",
"copy": "https://api.{hostname}",
"earn": "https://api.{hostname}",
},
"www": "https://www.bitget.com",
"doc": []interface{}{"https://www.bitget.com/api-doc/common/intro", "https://www.bitget.com/api-doc/spot/intro", "https://www.bitget.com/api-doc/contract/intro", "https://www.bitget.com/api-doc/broker/intro", "https://www.bitget.com/api-doc/margin/intro", "https://www.bitget.com/api-doc/copytrading/intro", "https://www.bitget.com/api-doc/earn/intro", "https://bitgetlimited.github.io/apidoc/en/mix", "https://bitgetlimited.github.io/apidoc/en/spot", "https://bitgetlimited.github.io/apidoc/en/broker", "https://bitgetlimited.github.io/apidoc/en/margin"},
"fees": "https://www.bitget.cc/zh-CN/rate?tab=1",
"referral": "https://www.bitget.com/expressly?languageType=0&channelCode=ccxt&vipCode=tg9j",
},
"api": map[string]interface{} {
"public": map[string]interface{} {
"common": map[string]interface{} {
"get": map[string]interface{} {
"v2/public/annoucements": 1,
"v2/public/time": 1,
},
},
"spot": map[string]interface{} {
"get": map[string]interface{} {
"spot/v1/notice/queryAllNotices": 1,
"spot/v1/public/time": 1,
"spot/v1/public/currencies": 6.6667,
"spot/v1/public/products": 1,
"spot/v1/public/product": 1,
"spot/v1/market/ticker": 1,
"spot/v1/market/tickers": 1,
"spot/v1/market/fills": 2,
"spot/v1/market/fills-history": 2,
"spot/v1/market/candles": 1,
"spot/v1/market/depth": 1,
"spot/v1/market/spot-vip-level": 2,
"spot/v1/market/merge-depth": 1,
"spot/v1/market/history-candles": 1,
"spot/v1/public/loan/coinInfos": 2,
"spot/v1/public/loan/hour-interest": 2,
"v2/spot/public/coins": 6.6667,
"v2/spot/public/symbols": 1,
"v2/spot/market/vip-fee-rate": 2,
"v2/spot/market/tickers": 1,
"v2/spot/market/merge-depth": 1,
"v2/spot/market/orderbook": 1,
"v2/spot/market/candles": 1,
"v2/spot/market/history-candles": 1,
"v2/spot/market/fills": 2,
"v2/spot/market/fills-history": 2,
},
},
"mix": map[string]interface{} {
"get": map[string]interface{} {
"mix/v1/market/contracts": 1,
"mix/v1/market/depth": 1,
"mix/v1/market/ticker": 1,
"mix/v1/market/tickers": 1,
"mix/v1/market/contract-vip-level": 2,
"mix/v1/market/fills": 1,
"mix/v1/market/fills-history": 2,
"mix/v1/market/candles": 1,
"mix/v1/market/index": 1,
"mix/v1/market/funding-time": 1,
"mix/v1/market/history-fundRate": 1,
"mix/v1/market/current-fundRate": 1,
"mix/v1/market/open-interest": 1,
"mix/v1/market/mark-price": 1,
"mix/v1/market/symbol-leverage": 1,
"mix/v1/market/queryPositionLever": 1,
"mix/v1/market/open-limit": 1,
"mix/v1/market/history-candles": 1,
"mix/v1/market/history-index-candles": 1,
"mix/v1/market/history-mark-candles": 1,
"mix/v1/market/merge-depth": 1,
"v2/mix/market/vip-fee-rate": 2,
"v2/mix/market/merge-depth": 1,
"v2/mix/market/ticker": 1,
"v2/mix/market/tickers": 1,
"v2/mix/market/fills": 1,
"v2/mix/market/fills-history": 2,
"v2/mix/market/candles": 1,
"v2/mix/market/history-candles": 1,
"v2/mix/market/history-index-candles": 1,
"v2/mix/market/history-mark-candles": 1,
"v2/mix/market/open-interest": 1,
"v2/mix/market/funding-time": 1,
"v2/mix/market/symbol-price": 1,
"v2/mix/market/history-fund-rate": 1,
"v2/mix/market/current-fund-rate": 1,
"v2/mix/market/contracts": 1,
"v2/mix/market/query-position-lever": 2,
"v2/mix/market/account-long-short": 20,
},
},
"margin": map[string]interface{} {
"get": map[string]interface{} {
"margin/v1/cross/public/interestRateAndLimit": 2,
"margin/v1/isolated/public/interestRateAndLimit": 2,
"margin/v1/cross/public/tierData": 2,
"margin/v1/isolated/public/tierData": 2,
"margin/v1/public/currencies": 1,
"v2/margin/currencies": 2,
"v2/margin/market/long-short-ratio": 20,
},
},
"earn": map[string]interface{} {
"get": map[string]interface{} {
"v2/earn/loan/public/coinInfos": 2,
"v2/earn/loan/public/hour-interest": 2,
},
},
},
"private": map[string]interface{} {
"spot": map[string]interface{} {
"get": map[string]interface{} {
"spot/v1/wallet/deposit-address": 4,
"spot/v1/wallet/withdrawal-list": 1,
"spot/v1/wallet/deposit-list": 1,
"spot/v1/account/getInfo": 20,
"spot/v1/account/assets": 2,
"spot/v1/account/assets-lite": 2,
"spot/v1/account/transferRecords": 1,
"spot/v1/convert/currencies": 2,
"spot/v1/convert/convert-record": 2,
"spot/v1/loan/ongoing-orders": 2,
"spot/v1/loan/repay-history": 2,
"spot/v1/loan/revise-history": 2,
"spot/v1/loan/borrow-history": 2,
"spot/v1/loan/debts": 2,
"v2/spot/trade/orderInfo": 1,
"v2/spot/trade/unfilled-orders": 1,
"v2/spot/trade/history-orders": 1,
"v2/spot/trade/fills": 2,
"v2/spot/trade/current-plan-order": 1,
"v2/spot/trade/history-plan-order": 1,
"v2/spot/account/info": 20,
"v2/spot/account/assets": 2,
"v2/spot/account/subaccount-assets": 2,
"v2/spot/account/bills": 2,
"v2/spot/account/transferRecords": 1,
"v2/account/funding-assets": 2,
"v2/account/bot-assets": 2,
"v2/account/all-account-balance": 20,
"v2/spot/wallet/deposit-address": 2,
"v2/spot/wallet/deposit-records": 2,
"v2/spot/wallet/withdrawal-records": 2,
},
"post": map[string]interface{} {
"spot/v1/wallet/transfer": 4,
"spot/v1/wallet/transfer-v2": 4,
"spot/v1/wallet/subTransfer": 10,
"spot/v1/wallet/withdrawal": 4,
"spot/v1/wallet/withdrawal-v2": 4,
"spot/v1/wallet/withdrawal-inner": 4,
"spot/v1/wallet/withdrawal-inner-v2": 4,
"spot/v1/account/sub-account-spot-assets": 200,
"spot/v1/account/bills": 2,
"spot/v1/trade/orders": 2,
"spot/v1/trade/batch-orders": 4,
"spot/v1/trade/cancel-order": 2,
"spot/v1/trade/cancel-order-v2": 2,
"spot/v1/trade/cancel-symbol-order": 2,
"spot/v1/trade/cancel-batch-orders": 4,
"spot/v1/trade/cancel-batch-orders-v2": 4,
"spot/v1/trade/orderInfo": 1,
"spot/v1/trade/open-orders": 1,
"spot/v1/trade/history": 1,
"spot/v1/trade/fills": 1,
"spot/v1/plan/placePlan": 1,
"spot/v1/plan/modifyPlan": 1,
"spot/v1/plan/cancelPlan": 1,
"spot/v1/plan/currentPlan": 1,
"spot/v1/plan/historyPlan": 1,
"spot/v1/plan/batchCancelPlan": 2,
"spot/v1/convert/quoted-price": 4,
"spot/v1/convert/trade": 4,
"spot/v1/loan/borrow": 2,
"spot/v1/loan/repay": 2,
"spot/v1/loan/revise-pledge": 2,
"spot/v1/trace/order/orderCurrentList": 2,
"spot/v1/trace/order/orderHistoryList": 2,
"spot/v1/trace/order/closeTrackingOrder": 2,
"spot/v1/trace/order/updateTpsl": 2,
"spot/v1/trace/order/followerEndOrder": 2,
"spot/v1/trace/order/spotInfoList": 2,
"spot/v1/trace/config/getTraderSettings": 2,
"spot/v1/trace/config/getFollowerSettings": 2,
"spot/v1/trace/user/myTraders": 2,
"spot/v1/trace/config/setFollowerConfig": 2,
"spot/v1/trace/user/myFollowers": 2,
"spot/v1/trace/config/setProductCode": 2,
"spot/v1/trace/user/removeTrader": 2,
"spot/v1/trace/getRemovableFollower": 2,
"spot/v1/trace/user/removeFollower": 2,
"spot/v1/trace/profit/totalProfitInfo": 2,
"spot/v1/trace/profit/totalProfitList": 2,
"spot/v1/trace/profit/profitHisList": 2,
"spot/v1/trace/profit/profitHisDetailList": 2,
"spot/v1/trace/profit/waitProfitDetailList": 2,
"spot/v1/trace/user/getTraderInfo": 2,
"v2/spot/trade/place-order": 2,
"v2/spot/trade/cancel-order": 2,
"v2/spot/trade/batch-orders": 20,
"v2/spot/trade/batch-cancel-order": 2,
"v2/spot/trade/cancel-symbol-order": 4,
"v2/spot/trade/place-plan-order": 1,
"v2/spot/trade/modify-plan-order": 1,
"v2/spot/trade/cancel-plan-order": 1,
"v2/spot/trade/batch-cancel-plan-order": 2,
"v2/spot/wallet/transfer": 2,
"v2/spot/wallet/subaccount-transfer": 2,
"v2/spot/wallet/withdrawal": 2,
"v2/spot/wallet/cancel-withdrawal": 2,
"v2/spot/wallet/modify-deposit-account": 2,
},
},
"mix": map[string]interface{} {
"get": map[string]interface{} {
"mix/v1/account/account": 2,
"mix/v1/account/accounts": 2,
"mix/v1/position/singlePosition": 2,
"mix/v1/position/singlePosition-v2": 2,
"mix/v1/position/allPosition": 4,
"mix/v1/position/allPosition-v2": 4,
"mix/v1/position/history-position": 1,
"mix/v1/account/accountBill": 2,
"mix/v1/account/accountBusinessBill": 4,
"mix/v1/order/current": 1,
"mix/v1/order/marginCoinCurrent": 1,
"mix/v1/order/history": 2,
"mix/v1/order/historyProductType": 4,
"mix/v1/order/detail": 2,
"mix/v1/order/fills": 2,
"mix/v1/order/allFills": 2,
"mix/v1/plan/currentPlan": 1,
"mix/v1/plan/historyPlan": 2,
"mix/v1/trace/currentTrack": 2,
"mix/v1/trace/followerOrder": 2,
"mix/v1/trace/followerHistoryOrders": 2,
"mix/v1/trace/historyTrack": 2,
"mix/v1/trace/summary": 1,
"mix/v1/trace/profitSettleTokenIdGroup": 1,
"mix/v1/trace/profitDateGroupList": 1,
"mix/v1/trade/profitDateList": 2,
"mix/v1/trace/waitProfitDateList": 1,
"mix/v1/trace/traderSymbols": 1,
"mix/v1/trace/traderList": 2,
"mix/v1/trace/traderDetail": 2,
"mix/v1/trace/queryTraceConfig": 2,
"v2/mix/account/account": 2,
"v2/mix/account/accounts": 2,
"v2/mix/account/sub-account-assets": 200,
"v2/mix/account/open-count": 2,
"v2/mix/account/bill": 2,
"v2/mix/market/query-position-lever": 2,
"v2/mix/position/single-position": 2,
"v2/mix/position/all-position": 4,
"v2/mix/position/history-position": 1,
"v2/mix/order/detail": 2,
"v2/mix/order/fills": 2,
"v2/mix/order/fill-history": 2,
"v2/mix/order/orders-pending": 2,
"v2/mix/order/orders-history": 2,
"v2/mix/order/orders-plan-pending": 2,
"v2/mix/order/orders-plan-history": 2,
"v2/mix/market/position-long-short": 20,
},
"post": map[string]interface{} {
"mix/v1/account/sub-account-contract-assets": 200,
"mix/v1/account/open-count": 1,
"mix/v1/account/setLeverage": 4,
"mix/v1/account/setMargin": 4,
"mix/v1/account/setMarginMode": 4,
"mix/v1/account/setPositionMode": 4,
"mix/v1/order/placeOrder": 2,
"mix/v1/order/batch-orders": 2,
"mix/v1/order/cancel-order": 2,
"mix/v1/order/cancel-batch-orders": 2,
"mix/v1/order/modifyOrder": 2,
"mix/v1/order/cancel-symbol-orders": 2,
"mix/v1/order/cancel-all-orders": 2,
"mix/v1/order/close-all-positions": 20,
"mix/v1/plan/placePlan": 2,
"mix/v1/plan/modifyPlan": 2,
"mix/v1/plan/modifyPlanPreset": 2,
"mix/v1/plan/placeTPSL": 2,
"mix/v1/plan/placeTrailStop": 2,
"mix/v1/plan/placePositionsTPSL": 2,
"mix/v1/plan/modifyTPSLPlan": 2,
"mix/v1/plan/cancelPlan": 2,
"mix/v1/plan/cancelSymbolPlan": 2,
"mix/v1/plan/cancelAllPlan": 2,
"mix/v1/trace/closeTrackOrder": 2,
"mix/v1/trace/modifyTPSL": 2,
"mix/v1/trace/closeTrackOrderBySymbol": 2,
"mix/v1/trace/setUpCopySymbols": 2,
"mix/v1/trace/followerSetBatchTraceConfig": 2,
"mix/v1/trace/followerCloseByTrackingNo": 2,
"mix/v1/trace/followerCloseByAll": 2,
"mix/v1/trace/followerSetTpsl": 2,
"mix/v1/trace/cancelCopyTrader": 4,
"mix/v1/trace/traderUpdateConfig": 2,
"mix/v1/trace/myTraderList": 2,
"mix/v1/trace/myFollowerList": 2,
"mix/v1/trace/removeFollower": 2,
"mix/v1/trace/public/getFollowerConfig": 2,
"mix/v1/trace/report/order/historyList": 2,
"mix/v1/trace/report/order/currentList": 2,
"mix/v1/trace/queryTraderTpslRatioConfig": 2,
"mix/v1/trace/traderUpdateTpslRatioConfig": 2,
"v2/mix/account/set-leverage": 4,
"v2/mix/account/set-margin": 4,
"v2/mix/account/set-margin-mode": 4,
"v2/mix/account/set-position-mode": 4,
"v2/mix/order/place-order": 2,
"v2/mix/order/click-backhand": 20,
"v2/mix/order/batch-place-order": 20,
"v2/mix/order/modify-order": 2,
"v2/mix/order/cancel-order": 2,
"v2/mix/order/batch-cancel-orders": 2,
"v2/mix/order/close-positions": 20,
"v2/mix/order/place-tpsl-order": 2,
"v2/mix/order/place-plan-order": 2,
"v2/mix/order/modify-tpsl-order": 2,
"v2/mix/order/modify-plan-order": 2,
"v2/mix/order/cancel-plan-order": 2,
},
},
"user": map[string]interface{} {
"get": map[string]interface{} {
"user/v1/fee/query": 2,
"user/v1/sub/virtual-list": 2,
"user/v1/sub/virtual-api-list": 2,
"user/v1/tax/spot-record": 1,
"user/v1/tax/future-record": 1,
"user/v1/tax/margin-record": 1,
"user/v1/tax/p2p-record": 1,
"v2/user/virtual-subaccount-list": 2,
"v2/user/virtual-subaccount-apikey-list": 2,
},
"post": map[string]interface{} {
"user/v1/sub/virtual-create": 4,
"user/v1/sub/virtual-modify": 4,
"user/v1/sub/virtual-api-batch-create": 20,
"user/v1/sub/virtual-api-create": 4,
"user/v1/sub/virtual-api-modify": 4,
"v2/user/create-virtual-subaccount": 4,
"v2/user/modify-virtual-subaccount": 4,
"v2/user/batch-create-subaccount-and-apikey": 20,
"v2/user/create-virtual-subaccount-apikey": 4,
"v2/user/modify-virtual-subaccount-apikey": 4,
},
},
"p2p": map[string]interface{} {
"get": map[string]interface{} {
"p2p/v1/merchant/merchantList": 2,
"p2p/v1/merchant/merchantInfo": 2,
"p2p/v1/merchant/advList": 2,
"p2p/v1/merchant/orderList": 2,
"v2/p2p/merchantList": 2,
"v2/p2p/merchantInfo": 2,
"v2/p2p/orderList": 2,
"v2/p2p/advList": 2,
},
},
"broker": map[string]interface{} {
"get": map[string]interface{} {
"broker/v1/account/info": 2,
"broker/v1/account/sub-list": 20,
"broker/v1/account/sub-email": 20,
"broker/v1/account/sub-spot-assets": 2,
"broker/v1/account/sub-future-assets": 2,
"broker/v1/account/subaccount-transfer": 1,
"broker/v1/account/subaccount-deposit": 1,
"broker/v1/account/subaccount-withdrawal": 1,
"broker/v1/account/sub-api-list": 2,
"v2/broker/account/info": 2,
"v2/broker/account/subaccount-list": 20,
"v2/broker/account/subaccount-email": 2,
"v2/broker/account/subaccount-spot-assets": 2,
"v2/broker/account/subaccount-future-assets": 2,
"v2/broker/manage/subaccount-apikey-list": 2,
},
"post": map[string]interface{} {
"broker/v1/account/sub-create": 20,
"broker/v1/account/sub-modify": 20,
"broker/v1/account/sub-modify-email": 20,
"broker/v1/account/sub-address": 2,
"broker/v1/account/sub-withdrawal": 2,
"broker/v1/account/sub-auto-transfer": 4,
"broker/v1/account/sub-api-create": 2,
"broker/v1/account/sub-api-modify": 2,
"v2/broker/account/modify-subaccount-email": 2,
"v2/broker/account/create-subaccount": 20,
"v2/broker/account/modify-subaccount": 20,
"v2/broker/account/subaccount-address": 2,
"v2/broker/account/subaccount-withdrawal": 2,
"v2/broker/account/set-subaccount-autotransfer": 2,
"v2/broker/manage/create-subaccount-apikey": 2,
"v2/broker/manage/modify-subaccount-apikey": 2,
},
},
"margin": map[string]interface{} {
"get": map[string]interface{} {
"margin/v1/cross/account/riskRate": 2,
"margin/v1/cross/account/maxTransferOutAmount": 2,
"margin/v1/isolated/account/maxTransferOutAmount": 2,
"margin/v1/isolated/order/openOrders": 2,
"margin/v1/isolated/order/history": 2,
"margin/v1/isolated/order/fills": 2,
"margin/v1/isolated/loan/list": 2,
"margin/v1/isolated/repay/list": 2,
"margin/v1/isolated/interest/list": 2,
"margin/v1/isolated/liquidation/list": 2,
"margin/v1/isolated/fin/list": 2,
"margin/v1/cross/order/openOrders": 2,
"margin/v1/cross/order/history": 2,
"margin/v1/cross/order/fills": 2,
"margin/v1/cross/loan/list": 2,
"margin/v1/cross/repay/list": 2,
"margin/v1/cross/interest/list": 2,
"margin/v1/cross/liquidation/list": 2,
"margin/v1/cross/fin/list": 2,
"margin/v1/cross/account/assets": 2,
"margin/v1/isolated/account/assets": 2,
"v2/margin/crossed/borrow-history": 2,
"v2/margin/crossed/repay-history": 2,
"v2/margin/crossed/interest-history": 2,
"v2/margin/crossed/liquidation-history": 2,
"v2/margin/crossed/financial-records": 2,
"v2/margin/crossed/account/assets": 2,
"v2/margin/crossed/account/risk-rate": 2,
"v2/margin/crossed/account/max-borrowable-amount": 2,
"v2/margin/crossed/account/max-transfer-out-amount": 2,
"v2/margin/crossed/interest-rate-and-limit": 2,
"v2/margin/crossed/tier-data": 2,
"v2/margin/crossed/open-orders": 2,
"v2/margin/crossed/history-orders": 2,
"v2/margin/crossed/fills": 2,
"v2/margin/isolated/borrow-history": 2,
"v2/margin/isolated/repay-history": 2,
"v2/margin/isolated/interest-history": 2,
"v2/margin/isolated/liquidation-history": 2,
"v2/margin/isolated/financial-records": 2,
"v2/margin/isolated/account/assets": 2,
"v2/margin/isolated/account/risk-rate": 2,
"v2/margin/isolated/account/max-borrowable-amount": 2,
"v2/margin/isolated/account/max-transfer-out-amount": 2,
"v2/margin/isolated/interest-rate-and-limit": 2,
"v2/margin/isolated/tier-data": 2,
"v2/margin/isolated/open-orders": 2,
"v2/margin/isolated/history-orders": 2,
"v2/margin/isolated/fills": 2,
},
"post": map[string]interface{} {
"margin/v1/cross/account/borrow": 2,
"margin/v1/isolated/account/borrow": 2,
"margin/v1/cross/account/repay": 2,
"margin/v1/isolated/account/repay": 2,
"margin/v1/isolated/account/riskRate": 2,
"margin/v1/cross/account/maxBorrowableAmount": 2,
"margin/v1/isolated/account/maxBorrowableAmount": 2,
"margin/v1/isolated/account/flashRepay": 2,
"margin/v1/isolated/account/queryFlashRepayStatus": 2,
"margin/v1/cross/account/flashRepay": 2,
"margin/v1/cross/account/queryFlashRepayStatus": 2,
"margin/v1/isolated/order/placeOrder": 4,
"margin/v1/isolated/order/batchPlaceOrder": 4,
"margin/v1/isolated/order/cancelOrder": 2,
"margin/v1/isolated/order/batchCancelOrder": 2,
"margin/v1/cross/order/placeOrder": 2,
"margin/v1/cross/order/batchPlaceOrder": 2,
"margin/v1/cross/order/cancelOrder": 2,
"margin/v1/cross/order/batchCancelOrder": 2,
"v2/margin/crossed/account/borrow": 2,
"v2/margin/crossed/account/repay": 2,
"v2/margin/crossed/account/flash-repay": 2,
"v2/margin/crossed/account/query-flash-repay-status": 2,
"v2/margin/crossed/place-order": 2,
"v2/margin/crossed/batch-place-order": 2,
"v2/margin/crossed/cancel-order": 2,
"v2/margin/crossed/batch-cancel-order": 2,
"v2/margin/isolated/account/borrow": 2,
"v2/margin/isolated/account/repay": 2,
"v2/margin/isolated/account/flash-repay": 2,
"v2/margin/isolated/account/query-flash-repay-status": 2,
"v2/margin/isolated/place-order": 2,
"v2/margin/isolated/batch-place-order": 2,
"v2/margin/isolated/cancel-order": 2,
"v2/margin/isolated/batch-cancel-order": 2,
},
},
"copy": map[string]interface{} {
"get": map[string]interface{} {
"v2/copy/mix-trader/order-current-track": 2,
"v2/copy/mix-trader/order-history-track": 2,
"v2/copy/mix-trader/order-total-detail": 2,
"v2/copy/mix-trader/profit-history-summarys": 1,
"v2/copy/mix-trader/profit-history-details": 1,
"v2/copy/mix-trader/profit-details": 1,
"v2/copy/mix-trader/profits-group-coin-date": 1,
"v2/copy/mix-trader/config-query-symbols": 1,
"v2/copy/mix-trader/config-query-followers": 2,
"v2/copy/mix-follower/query-current-orders": 2,
"v2/copy/mix-follower/query-history-orders": 1,
"v2/copy/mix-follower/query-settings": 2,
"v2/copy/mix-follower/query-traders": 2,
"v2/copy/mix-follower/query-quantity-limit": 2,
"v2/copy/mix-broker/query-traders": 2,
"v2/copy/mix-broker/query-history-traces": 2,
"v2/copy/mix-broker/query-current-traces": 2,
"v2/copy/spot-trader/profit-summarys": 2,
"v2/copy/spot-trader/profit-history-details": 2,
"v2/copy/spot-trader/profit-details": 2,
"v2/copy/spot-trader/order-total-detail": 2,
"v2/copy/spot-trader/order-history-track": 2,
"v2/copy/spot-trader/order-current-track": 2,
"v2/copy/spot-trader/config-query-settings": 2,
"v2/copy/spot-trader/config-query-followers": 2,
"v2/copy/spot-follower/query-traders": 2,
"v2/copy/spot-follower/query-trader-symbols": 2,
"v2/copy/spot-follower/query-settings": 2,
"v2/copy/spot-follower/query-history-orders": 2,
"v2/copy/spot-follower/query-current-orders": 2,
},
"post": map[string]interface{} {
"v2/copy/mix-trader/order-modify-tpsl": 2,
"v2/copy/mix-trader/order-close-positions": 2,
"v2/copy/mix-trader/config-setting-symbols": 2,
"v2/copy/mix-trader/config-setting-base": 2,
"v2/copy/mix-trader/config-remove-follower": 2,
"v2/copy/mix-follower/setting-tpsl": 1,
"v2/copy/mix-follower/settings": 2,
"v2/copy/mix-follower/close-positions": 2,
"v2/copy/mix-follower/cancel-trader": 4,
"v2/copy/spot-trader/order-modify-tpsl": 2,
"v2/copy/spot-trader/order-close-tracking": 2,
"v2/copy/spot-trader/config-setting-symbols": 2,
"v2/copy/spot-trader/config-remove-follower": 2,
"v2/copy/spot-follower/stop-order": 2,
"v2/copy/spot-follower/settings": 2,
"v2/copy/spot-follower/setting-tpsl": 2,
"v2/copy/spot-follower/order-close-tracking": 2,
"v2/copy/spot-follower/cancel-trader": 2,
},
},
"tax": map[string]interface{} {
"get": map[string]interface{} {
"v2/tax/spot-record": 20,
"v2/tax/future-record": 20,
"v2/tax/margin-record": 20,
"v2/tax/p2p-record": 20,
},
},
"convert": map[string]interface{} {
"get": map[string]interface{} {
"v2/convert/currencies": 2,
"v2/convert/quoted-price": 2,
"v2/convert/convert-record": 2,
"v2/convert/bgb-convert-coin-list": 2,
"v2/convert/bgb-convert-records": 2,
},
"post": map[string]interface{} {
"v2/convert/trade": 2,
"v2/convert/bgb-convert": 2,
},
},
"earn": map[string]interface{} {
"get": map[string]interface{} {
"v2/earn/savings/product": 2,
"v2/earn/savings/account": 2,
"v2/earn/savings/assets": 2,
"v2/earn/savings/records": 2,
"v2/earn/savings/subscribe-info": 2,
"v2/earn/savings/subscribe-result": 2,
"v2/earn/savings/redeem-result": 2,
"v2/earn/sharkfin/product": 2,
"v2/earn/sharkfin/account": 2,
"v2/earn/sharkfin/assets": 2,
"v2/earn/sharkfin/records": 2,
"v2/earn/sharkfin/subscribe-info": 2,
"v2/earn/sharkfin/subscribe-result": 4,
"v2/earn/loan/ongoing-orders": 2,
"v2/earn/loan/repay-history": 2,
"v2/earn/loan/revise-history": 2,
"v2/earn/loan/borrow-history": 2,
"v2/earn/loan/debts": 2,
"v2/earn/loan/reduces": 2,
"v2/earn/account/assets": 2,
},
"post": map[string]interface{} {
"v2/earn/savings/subscribe": 2,
"v2/earn/savings/redeem": 2,
"v2/earn/sharkfin/subscribe": 2,
"v2/earn/loan/borrow": 2,
"v2/earn/loan/repay": 2,
"v2/earn/loan/revise-pledge": 2,
},
},
"common": map[string]interface{} {
"get": map[string]interface{} {
"v2/common/trade-rate": 2,
},
},
},
},
"fees": map[string]interface{} {
"spot": map[string]interface{} {
"taker": this.ParseNumber("0.002"),
"maker": this.ParseNumber("0.002"),
},
"swap": map[string]interface{} {
"taker": this.ParseNumber("0.0006"),
"maker": this.ParseNumber("0.0004"),
},
},
"requiredCredentials": map[string]interface{} {
"apiKey": true,
"secret": true,
"password": true,
},
"exceptions": map[string]interface{} {
"exact": map[string]interface{} {
"1": ExchangeError,
"failure to get a peer from the ring-balancer": ExchangeNotAvailable,
"4010": PermissionDenied,
"4001": ExchangeError,
"4002": ExchangeError,
"30001": AuthenticationError,
"30002": AuthenticationError,
"30003": AuthenticationError,
"30004": AuthenticationError,
"30005": InvalidNonce,
"30006": AuthenticationError,
"30007": BadRequest,
"30008": RequestTimeout,
"30009": ExchangeError,
"30010": AuthenticationError,
"30011": PermissionDenied,
"30012": AuthenticationError,
"30013": AuthenticationError,
"30014": DDoSProtection,
"30015": AuthenticationError,
"30016": ExchangeError,
"30017": ExchangeError,
"30018": ExchangeError,
"30019": ExchangeNotAvailable,
"30020": BadRequest,
"30021": BadRequest,
"30022": PermissionDenied,
"30023": BadRequest,
"30024": BadSymbol,
"30025": BadRequest,
"30026": DDoSProtection,
"30027": AuthenticationError,
"30028": PermissionDenied,
"30029": AccountSuspended,
"30030": ExchangeError,
"30031": BadRequest,
"30032": BadSymbol,
"30033": BadRequest,
"30034": ExchangeError,
"30035": ExchangeError,
"30036": ExchangeError,
"30037": ExchangeNotAvailable,
"30038": OnMaintenance,
"32001": AccountSuspended,
"32002": PermissionDenied,
"32003": CancelPending,
"32004": ExchangeError,
"32005": InvalidOrder,
"32006": InvalidOrder,
"32007": InvalidOrder,
"32008": InvalidOrder,
"32009": InvalidOrder,
"32010": ExchangeError,
"32011": ExchangeError,
"32012": ExchangeError,
"32013": ExchangeError,
"32014": ExchangeError,
"32015": ExchangeError,
"32016": ExchangeError,
"32017": ExchangeError,
"32018": ExchangeError,
"32019": ExchangeError,
"32020": ExchangeError,
"32021": ExchangeError,
"32022": ExchangeError,
"32023": ExchangeError,
"32024": ExchangeError,
"32025": ExchangeError,
"32026": ExchangeError,
"32027": ExchangeError,
"32028": AccountSuspended,
"32029": ExchangeError,
"32030": InvalidOrder,
"32031": ArgumentsRequired,
"32038": AuthenticationError,
"32040": ExchangeError,
"32044": ExchangeError,
"32045": ExchangeError,
"32046": ExchangeError,
"32047": ExchangeError,
"32048": InvalidOrder,
"32049": ExchangeError,
"32050": InvalidOrder,
"32051": InvalidOrder,
"32052": ExchangeError,
"32053": ExchangeError,
"32057": ExchangeError,
"32054": ExchangeError,
"32055": InvalidOrder,
"32056": ExchangeError,
"32058": ExchangeError,
"32059": InvalidOrder,
"32060": InvalidOrder,
"32061": InvalidOrder,
"32062": InvalidOrder,
"32063": InvalidOrder,
"32064": ExchangeError,
"32065": ExchangeError,
"32066": ExchangeError,
"32067": ExchangeError,
"32068": ExchangeError,
"32069": ExchangeError,
"32070": ExchangeError,
"32071": ExchangeError,
"32072": ExchangeError,
"32073": ExchangeError,
"32074": ExchangeError,
"32075": ExchangeError,
"32076": ExchangeError,
"32077": ExchangeError,
"32078": ExchangeError,
"32079": ExchangeError,
"32080": ExchangeError,
"32083": ExchangeError,
"33001": PermissionDenied,
"33002": AccountSuspended,
"33003": InsufficientFunds,
"33004": ExchangeError,
"33005": ExchangeError,
"33006": ExchangeError,
"33007": ExchangeError,
"33008": InsufficientFunds,
"33009": ExchangeError,
"33010": ExchangeError,
"33011": ExchangeError,
"33012": ExchangeError,
"33013": InvalidOrder,
"33014": OrderNotFound,
"33015": InvalidOrder,
"33016": ExchangeError,
"33017": InsufficientFunds,
"33018": ExchangeError,
"33020": ExchangeError,
"33021": BadRequest,
"33022": InvalidOrder,
"33023": ExchangeError,
"33024": InvalidOrder,
"33025": InvalidOrder,
"33026": ExchangeError,
"33027": InvalidOrder,
"33028": InvalidOrder,
"33029": InvalidOrder,
"33034": ExchangeError,
"33035": ExchangeError,
"33036": ExchangeError,
"33037": ExchangeError,
"33038": ExchangeError,
"33039": ExchangeError,
"33040": ExchangeError,
"33041": ExchangeError,
"33042": ExchangeError,
"33043": ExchangeError,
"33044": ExchangeError,
"33045": ExchangeError,
"33046": ExchangeError,
"33047": ExchangeError,
"33048": ExchangeError,
"33049": ExchangeError,
"33050": ExchangeError,
"33051": ExchangeError,
"33059": BadRequest,
"33060": BadRequest,
"33061": ExchangeError,
"33062": ExchangeError,
"33063": ExchangeError,
"33064": ExchangeError,
"33065": ExchangeError,
"21009": ExchangeError,
"34001": PermissionDenied,
"34002": InvalidAddress,
"34003": ExchangeError,
"34004": ExchangeError,
"34005": ExchangeError,
"34006": ExchangeError,
"34007": ExchangeError,
"34008": InsufficientFunds,
"34009": ExchangeError,
"34010": ExchangeError,
"34011": ExchangeError,
"34012": ExchangeError,
"34013": ExchangeError,
"34014": ExchangeError,
"34015": ExchangeError,
"34016": PermissionDenied,
"34017": AccountSuspended,
"34018": AuthenticationError,
"34019": PermissionDenied,
"34020": PermissionDenied,
"34021": InvalidAddress,
"34022": ExchangeError,
"34023": PermissionDenied,
"34026": ExchangeError,
"34036": ExchangeError,
"34037": ExchangeError,
"34038": ExchangeError,
"34039": ExchangeError,
"35001": ExchangeError,
"35002": ExchangeError,
"35003": ExchangeError,
"35004": ExchangeError,
"35005": AuthenticationError,
"35008": InvalidOrder,
"35010": InvalidOrder,
"35012": InvalidOrder,
"35014": InvalidOrder,
"35015": InvalidOrder,
"35017": ExchangeError,
"35019": InvalidOrder,
"35020": InvalidOrder,
"35021": InvalidOrder,
"35022": ExchangeError,
"35024": ExchangeError,
"35025": InsufficientFunds,
"35026": ExchangeError,
"35029": OrderNotFound,
"35030": InvalidOrder,
"35031": InvalidOrder,
"35032": ExchangeError,
"35037": ExchangeError,
"35039": ExchangeError,
"35040": InvalidOrder,
"35044": ExchangeError,
"35046": InsufficientFunds,
"35047": InsufficientFunds,
"35048": ExchangeError,
"35049": InvalidOrder,
"35050": InvalidOrder,
"35052": InsufficientFunds,
"35053": ExchangeError,
"35055": InsufficientFunds,
"35057": ExchangeError,
"35058": ExchangeError,
"35059": BadRequest,
"35060": BadRequest,
"35061": BadRequest,
"35062": InvalidOrder,
"35063": InvalidOrder,
"35064": InvalidOrder,
"35066": InvalidOrder,
"35067": InvalidOrder,
"35068": InvalidOrder,
"35069": InvalidOrder,
"35070": InvalidOrder,
"35071": InvalidOrder,
"35072": InvalidOrder,
"35073": InvalidOrder,
"35074": InvalidOrder,
"35075": InvalidOrder,
"35076": InvalidOrder,
"35077": InvalidOrder,
"35078": InvalidOrder,
"35079": InvalidOrder,
"35080": InvalidOrder,
"35081": InvalidOrder,
"35082": InvalidOrder,
"35083": InvalidOrder,
"35084": InvalidOrder,
"35085": InvalidOrder,
"35086": InvalidOrder,
"35087": InvalidOrder,
"35088": InvalidOrder,
"35089": InvalidOrder,
"35090": ExchangeError,
"35091": ExchangeError,
"35092": ExchangeError,
"35093": ExchangeError,
"35094": ExchangeError,
"35095": BadRequest,
"35096": ExchangeError,
"35097": ExchangeError,
"35098": ExchangeError,
"35099": ExchangeError,
"36001": BadRequest,
"36002": BadRequest,
"36005": ExchangeError,
"36101": AuthenticationError,
"36102": PermissionDenied,
"36103": AccountSuspended,
"36104": PermissionDenied,
"36105": PermissionDenied,
"36106": AccountSuspended,
"36107": PermissionDenied,
"36108": InsufficientFunds,
"36109": PermissionDenied,
"36201": PermissionDenied,
"36202": PermissionDenied,
"36203": InvalidOrder,
"36204": ExchangeError,
"36205": BadRequest,
"36206": BadRequest,
"36207": InvalidOrder,
"36208": InvalidOrder,
"36209": InvalidOrder,
"36210": InvalidOrder,
"36211": InvalidOrder,
"36212": InvalidOrder,
"36213": InvalidOrder,
"36214": ExchangeError,
"36216": OrderNotFound,
"36217": InvalidOrder,
"36218": InvalidOrder,
"36219": InvalidOrder,
"36220": InvalidOrder,
"36221": InvalidOrder,
"36222": InvalidOrder,
"36223": InvalidOrder,
"36224": InvalidOrder,
"36225": InvalidOrder,
"36226": InvalidOrder,
"36227": InvalidOrder,
"36228": InvalidOrder,
"36229": InvalidOrder,
"36230": InvalidOrder,
"400": BadRequest,
"401": AuthenticationError,
"403": PermissionDenied,
"404": BadRequest,
"405": BadRequest,
"415": BadRequest,
"429": DDoSProtection,
"500": ExchangeNotAvailable,
"1001": RateLimitExceeded,
"1002": ExchangeError,
"1003": ExchangeError,
"40001": AuthenticationError,
"40002": AuthenticationError,
"40003": AuthenticationError,
"40004": InvalidNonce,
"40005": InvalidNonce,
"40006": AuthenticationError,
"40007": BadRequest,
"40008": InvalidNonce,
"40009": AuthenticationError,
"40010": AuthenticationError,
"40011": AuthenticationError,
"40012": AuthenticationError,
"40013": ExchangeError,
"40014": PermissionDenied,
"40015": ExchangeError,
"40016": PermissionDenied,
"40017": ExchangeError,
"40018": PermissionDenied,
"40019": BadRequest,
"40031": AccountSuspended,
"40037": AuthenticationError,
"40102": BadRequest,
"40103": BadRequest,
"40104": ExchangeError,
"40105": ExchangeError,
"40106": ExchangeError,
"40107": ExchangeError,
"40108": InvalidOrder,
"40109": OrderNotFound,
"40200": OnMaintenance,
"40201": InvalidOrder,
"40202": ExchangeError,
"40203": BadRequest,
"40204": BadRequest,
"40205": BadRequest,
"40206": BadRequest,
"40207": BadRequest,
"40208": BadRequest,
"40209": BadRequest,
"40300": ExchangeError,
"40301": PermissionDenied,
"40302": BadRequest,
"40303": BadRequest,
"40304": BadRequest,
"40305": BadRequest,
"40306": ExchangeError,
"40308": OnMaintenance,
"40309": BadSymbol,
"40400": ExchangeError,
"40401": ExchangeError,
"40402": BadRequest,
"40403": BadRequest,
"40404": BadRequest,
"40405": BadRequest,
"40406": BadRequest,
"40407": ExchangeError,
"40408": ExchangeError,
"40409": ExchangeError,
"40500": InvalidOrder,
"40501": ExchangeError,
"40502": ExchangeError,
"40503": ExchangeError,
"40504": ExchangeError,
"40505": ExchangeError,
"40506": AuthenticationError,
"40507": AuthenticationError,
"40508": ExchangeError,
"40509": ExchangeError,
"40600": ExchangeError,
"40601": ExchangeError,
"40602": ExchangeError,
"40603": ExchangeError,
"40604": ExchangeNotAvailable,
"40605": ExchangeError,
"40606": ExchangeError,
"40607": ExchangeError,
"40608": ExchangeError,
"40609": ExchangeError,
"40700": BadRequest,
"40701": ExchangeError,
"40702": ExchangeError,
"40703": ExchangeError,
"40704": ExchangeError,
"40705": BadRequest,
"40706": InvalidOrder,
"40707": BadRequest,
"40708": BadRequest,
"40709": ExchangeError,
"40710": ExchangeError,
"40711": InsufficientFunds,
"40712": InsufficientFunds,
"40713": ExchangeError,
"40714": ExchangeError,
"40762": InsufficientFunds,
"40768": OrderNotFound,
"40808": InvalidOrder,
"41103": InvalidOrder,
"41114": OnMaintenance,
"43011": InvalidOrder,
"43001": OrderNotFound,
"43012": InsufficientFunds,
"43025": InvalidOrder,
"43115": OnMaintenance,
"45110": InvalidOrder,
"invalid sign": AuthenticationError,
"invalid currency": BadSymbol,
"invalid symbol": BadSymbol,
"invalid period": BadRequest,
"invalid user": ExchangeError,
"invalid amount": InvalidOrder,
"invalid type": InvalidOrder,
"invalid orderId": InvalidOrder,
"invalid record": ExchangeError,
"invalid accountId": BadRequest,
"invalid address": BadRequest,
"accesskey not null": AuthenticationError,
"illegal accesskey": AuthenticationError,
"sign not null": AuthenticationError,
"req_time is too much difference from server time": InvalidNonce,
"permissions not right": PermissionDenied,
"illegal sign invalid": AuthenticationError,
"user locked": AccountSuspended,
"Request Frequency Is Too High": RateLimitExceeded,
"more than a daily rate of cash": BadRequest,
"more than the maximum daily withdrawal amount": BadRequest,
"need to bind email or mobile": ExchangeError,
"user forbid": PermissionDenied,
"User Prohibited Cash Withdrawal": PermissionDenied,
"Cash Withdrawal Is Less Than The Minimum Value": BadRequest,
"Cash Withdrawal Is More Than The Maximum Value": BadRequest,
"the account with in 24 hours ban coin": PermissionDenied,
"order cancel fail": BadRequest,
"base symbol error": BadSymbol,
"base date error": ExchangeError,
"api signature not valid": AuthenticationError,
"gateway internal error": ExchangeError,
"audit failed": ExchangeError,
"order queryorder invalid": BadRequest,
"market no need price": InvalidOrder,
"limit need price": InvalidOrder,
"userid not equal to account_id": ExchangeError,
"your balance is low": InsufficientFunds,
"address invalid cointype": ExchangeError,
"system exception": ExchangeError,
"50003": ExchangeError,
"50004": BadSymbol,
"50006": PermissionDenied,
"50007": PermissionDenied,
"50008": RequestTimeout,
"50009": RateLimitExceeded,
"50010": ExchangeError,
"50014": InvalidOrder,
"50015": InvalidOrder,
"50016": InvalidOrder,
"50017": InvalidOrder,
"50018": InvalidOrder,
"50019": InvalidOrder,
"50020": InsufficientFunds,
"50021": InvalidOrder,
"50026": InvalidOrder,
"invalid order query time": ExchangeError,
"invalid start time": BadRequest,
"invalid end time": BadRequest,
"20003": ExchangeError,
"01001": ExchangeError,
"43111": PermissionDenied,
},
"broad": map[string]interface{} {
"invalid size, valid range": ExchangeError,
},
},
"precisionMode": TICK_SIZE,
"commonCurrencies": map[string]interface{} {
"APX": "AstroPepeX",
"DEGEN": "DegenReborn",
"JADE": "Jade Protocol",
"OMNI": "omni",
"TONCOIN": "TON",
},
"options": map[string]interface{} {
"timeDifference": 0,
"adjustForTimeDifference": false,
"timeframes": map[string]interface{} {
"spot": map[string]interface{} {
"1m": "1min",
"5m": "5min",
"15m": "15min",
"30m": "30min",
"1h": "1h",
"4h": "4h",
"6h": "6Hutc",
"12h": "12Hutc",
"1d": "1Dutc",
"3d": "3Dutc",
"1w": "1Wutc",
"1M": "1Mutc",
},
"swap": map[string]interface{} {
"1m": "1m",
"3m": "3m",
"5m": "5m",
"15m": "15m",
"30m": "30m",
"1h": "1H",
"2h": "2H",
"4h": "4H",
"6h": "6Hutc",
"12h": "12Hutc",
"1d": "1Dutc",
"3d": "3Dutc",
"1w": "1Wutc",
"1M": "1Mutc",
},
},
"fetchMarkets": []interface{}{"spot", "swap"},
"defaultType": "spot",
"defaultSubType": "linear",
"createMarketBuyOrderRequiresPrice": true,
"broker": "p4sve",
"withdraw": map[string]interface{} {
"fillResponseFromRequest": true,
},
"fetchOHLCV": map[string]interface{} {
"spot": map[string]interface{} {
"method": "publicSpotGetV2SpotMarketCandles",
},
"swap": map[string]interface{} {
"method": "publicMixGetV2MixMarketCandles",
},
"maxDaysPerTimeframe": map[string]interface{} {
"1m": 30,
"3m": 30,
"5m": 30,
"10m": 30,
"15m": 52,
"30m": 62,
"1h": 83,
"2h": 120,
"4h": 240,
"6h": 360,
"12h": 360,
"1d": 300,
"3d": 300,
"1w": 300,
"1M": 300,
},
},
"fetchTrades": map[string]interface{} {
"spot": map[string]interface{} {
"method": "publicSpotGetV2SpotMarketFillsHistory",
},
"swap": map[string]interface{} {
"method": "publicMixGetV2MixMarketFillsHistory",
},
},
"accountsByType": map[string]interface{} {
"spot": "spot",
"cross": "crossed_margin",
"isolated": "isolated_margin",
"swap": "usdt_futures",
"usdc_swap": "usdc_futures",
"future": "coin_futures",
"p2p": "p2p",
},
"accountsById": map[string]interface{} {
"spot": "spot",
"crossed_margin": "cross",
"isolated_margin": "isolated",
"usdt_futures": "swap",
"usdc_futures": "usdc_swap",
"coin_futures": "future",
"p2p": "p2p",
},
"sandboxMode": false,
"networks": map[string]interface{} {
"TRC20": "TRC20",
"ERC20": "ERC20",
"BEP20": "BSC",
"BSC": "BEP20",
"ATOM": "ATOM",
"ACA": "AcalaToken",
"APT": "Aptos",
"ARBONE": "ArbitrumOne",
"ARBNOVA": "ArbitrumNova",
"AVAXC": "C-Chain",
"AVAXX": "X-Chain",
"AR": "Arweave",
"BCH": "BCH",
"BCHA": "BCHA",
"BITCI": "BITCI",
"BTC": "BTC",
"CELO": "CELO",
"CSPR": "CSPR",
"ADA": "Cardano",
"CHZ": "ChilizChain",
"CRC20": "CronosChain",
"DOGE": "DOGE",
"DOT": "DOT",
"EOS": "EOS",
"ETHF": "ETHFAIR",
"ETHW": "ETHW",
"ETC": "ETC",
"EGLD": "Elrond",
"FIL": "FIL",
"FIO": "FIO",
"FTM": "Fantom",
"HRC20": "HECO",
"ONE": "Harmony",
"HNT": "Helium",
"ICP": "ICP",
"IOTX": "IoTeX",
"KARDIA": "KAI",
"KAVA": "KAVA",
"KDA": "KDA",
"KLAY": "Klaytn",
"KSM": "Kusama",
"LAT": "LAT",
"LTC": "LTC",
"MINA": "MINA",
"MOVR": "MOVR",
"METIS": "MetisToken",
"GLMR": "Moonbeam",
"NEAR": "NEARProtocol",
"NULS": "NULS",
"OASYS": "OASYS",
"OASIS": "ROSE",
"OMNI": "OMNI",
"ONT": "Ontology",
"OPTIMISM": "Optimism",
"OSMO": "Osmosis",
"POKT": "PocketNetwork",
"MATIC": "Polygon",
"QTUM": "QTUM",
"REEF": "REEF",
"SOL": "SOL",
"SYS": "SYS",
"SXP": "Solar",
"XYM": "Symbol",
"TON": "TON",
"TT": "TT",
"TLOS": "Telos",
"THETA": "ThetaToken",
"VITE": "VITE",
"WAVES": "WAVES",
"WAX": "WAXP",
"WEMIX": "WEMIXMainnet",
"XDC": "XDCNetworkXDC",
"XRP": "XRP",
"FET": "FETCH",
"NEM": "NEM",
"REI": "REINetwork",
"ZIL": "ZIL",
"ABBC": "ABBCCoin",
"RSK": "RSK",
"AZERO": "AZERO",
"TRC10": "TRC10",
"JUNO": "JUNO",
"ZKSYNC": "zkSyncEra",
"STARKNET": "Starknet",
"VIC": "VICTION",
},
"networksById": map[string]interface{} {},
"fetchPositions": map[string]interface{} {
"method": "privateMixGetV2MixPositionAllPosition",
},
"defaultTimeInForce": "GTC",
},
"features": map[string]interface{} {
"spot": map[string]interface{} {
"sandbox": true,
"createOrder": map[string]interface{} {
"marginMode": true,
"triggerPrice": true,
"triggerPriceType": map[string]interface{} {
"last": true,
"mark": true,
"index": false,
},
"triggerDirection": false,
"stopLossPrice": true,
"takeProfitPrice": true,
"attachedStopLossTakeProfit": map[string]interface{} {
"triggerPriceType": map[string]interface{} {
"last": false,
"mark": false,
"index": false,
},
"price": true,
},
"timeInForce": map[string]interface{} {
"IOC": true,
"FOK": true,
"PO": true,
"GTD": false,
},
"hedged": false,
"trailing": false,
"marketBuyRequiresPrice": true,
"marketBuyByCost": true,
},
"createOrders": map[string]interface{} {
"max": 50,
},
"fetchMyTrades": map[string]interface{} {
"marginMode": true,
"limit": 100,
"daysBack": nil,
"untilDays": 90,
"symbolRequired": true,
},
"fetchOrder": map[string]interface{} {
"marginMode": false,
"trigger": false,
"trailing": false,
"symbolRequired": true,
},
"fetchOpenOrders": map[string]interface{} {
"marginMode": true,
"limit": 100,
"trigger": true,
"trailing": false,
"symbolRequired": false,
},
"fetchOrders": nil,
"fetchClosedOrders": map[string]interface{} {
"marginMode": true,
"limit": 100,
"daysBack": nil,
"daysBackCanceled": nil,
"untilDays": 90,
"trigger": true,
"trailing": false,
"symbolRequired": false,
},
"fetchOHLCV": map[string]interface{} {
"limit": 1000,
},
},
"forPerps": map[string]interface{} {
"extends": "spot",
"createOrder": map[string]interface{} {
"triggerPrice": true,
"triggerPriceType": map[string]interface{} {
"last": true,
"mark": true,
"index": false,
},
"triggerDirection": false,
"stopLossPrice": true,
"takeProfitPrice": true,
"attachedStopLossTakeProfit": map[string]interface{} {
"triggerPriceType": map[string]interface{} {
"last": true,
"mark": true,
"index": true,
},
"price": false,
},
"timeInForce": map[string]interface{} {
"IOC": true,
"FOK": true,
"PO": true,
"GTD": false,
},
"hedged": true,
"trailing": true,
"marketBuyRequiresPrice": false,
"marketBuyByCost": false,
},
"fetchMyTrades": map[string]interface{} {
"untilDays": 7,
},
"fetchClosedOrders": map[string]interface{} {
"trailing": true,
},
},
"swap": map[string]interface{} {
"linear": map[string]interface{} {
"extends": "forPerps",
},
"inverse": map[string]interface{} {
"extends": "forPerps",
},
},
"future": map[string]interface{} {
"linear": map[string]interface{} {
"extends": "forPerps",
},
"inverse": map[string]interface{} {
"extends": "forPerps",
},
},
},
})
}
func (this *bitget) SetSandboxMode(enabled interface{}) {
AddElementToObject(this.Options, "sandboxMode", enabled)
}
func (this *bitget) ConvertSymbolForSandbox(symbol interface{}) interface{} {
if IsTrue(StartsWith(symbol, "S")) {
// handle using the exchange specified sandbox symbols
return symbol
}
var convertedSymbol interface{} = nil
if IsTrue(IsGreaterThan(GetIndexOf(symbol, "/"), OpNeg(1))) {
if IsTrue(IsEqual(GetIndexOf(symbol, ":"), OpNeg(1))) {
panic(NotSupported(Add(this.Id, " sandbox supports swap and future markets only")))
}
var splitBase interface{} = Split(symbol, "/")
var previousBase interface{} = this.SafeString(splitBase, 0)
var previousQuoteSettleExpiry interface{} = this.SafeString(splitBase, 1)
var splitQuote interface{} = Split(previousQuoteSettleExpiry, ":")
var previousQuote interface{} = this.SafeString(splitQuote, 0)
var previousSettleExpiry interface{} = this.SafeString(splitQuote, 1)
var splitSettle interface{} = Split(previousSettleExpiry, "-")
var previousSettle interface{} = this.SafeString(splitSettle, 0)
var expiry interface{} = this.SafeString(splitSettle, 1)
convertedSymbol = Add(Add(Add(Add(Add("S", previousBase), "/S"), previousQuote), ":S"), previousSettle)
if IsTrue(!IsEqual(expiry, nil)) {
convertedSymbol = Add(Add(convertedSymbol, "-"), expiry)
}
} else {
// handle using a market id instead of a unified symbol
var base interface{} = Slice(symbol, 0, 3)
var remaining interface{} = Slice(symbol, 3, nil)
convertedSymbol = Add(Add(Add("S", base), "S"), remaining)
}
return convertedSymbol
}
func (this *bitget) HandleProductTypeAndParams(optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
var subType interface{} = nil
subTypeparamsVariable := this.HandleSubTypeAndParams("handleProductTypeAndParams", nil, params);
subType = GetValue(subTypeparamsVariable,0);
params = GetValue(subTypeparamsVariable,1)
var defaultProductType interface{} = nil
if IsTrue(IsTrue((!IsEqual(subType, nil))) && IsTrue((IsEqual(market, nil)))) {
// set default only if subType is defined and market is not defined, since there is also USDC productTypes which are also linear
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
if IsTrue(sandboxMode) {
defaultProductType = Ternary(IsTrue((IsEqual(subType, "linear"))), "SUSDT-FUTURES", "SCOIN-FUTURES")
} else {
defaultProductType = Ternary(IsTrue((IsEqual(subType, "linear"))), "USDT-FUTURES", "COIN-FUTURES")
}
}
var productType interface{} = this.SafeString(params, "productType", defaultProductType)
if IsTrue(IsTrue((IsEqual(productType, nil))) && IsTrue((!IsEqual(market, nil)))) {
var settle interface{} = GetValue(market, "settle")
if IsTrue(IsEqual(settle, "USDT")) {
productType = "USDT-FUTURES"
} else if IsTrue(IsEqual(settle, "USDC")) {
productType = "USDC-FUTURES"
} else if IsTrue(IsEqual(settle, "SUSDT")) {
productType = "SUSDT-FUTURES"
} else if IsTrue(IsEqual(settle, "SUSDC")) {
productType = "SUSDC-FUTURES"
} else if IsTrue(IsTrue(IsTrue((IsEqual(settle, "SBTC"))) || IsTrue((IsEqual(settle, "SETH")))) || IsTrue((IsEqual(settle, "SEOS")))) {
productType = "SCOIN-FUTURES"
} else {
productType = "COIN-FUTURES"
}
}
if IsTrue(IsEqual(productType, nil)) {
panic(ArgumentsRequired(Add(this.Id, " requires a productType param, one of \"USDT-FUTURES\", \"USDC-FUTURES\", \"COIN-FUTURES\", \"SUSDT-FUTURES\", \"SUSDC-FUTURES\" or \"SCOIN-FUTURES\"")))
}
params = this.Omit(params, "productType")
return []interface{}{productType, params}
}
/**
* @method
* @name bitget#fetchTime
* @description fetches the current integer timestamp in milliseconds from the exchange server
* @see https://www.bitget.com/api-doc/common/public/Get-Server-Time
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {int} the current integer timestamp in milliseconds from the exchange server
*/
func (this *bitget) FetchTime(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
response:= (<-this.PublicCommonGetV2PublicTime(params))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700111073740,
// "data": {
// "serverTime": "1700111073740"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
ch <- this.SafeInteger(data, "serverTime")
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchMarkets
* @description retrieves data on all markets for bitget
* @see https://www.bitget.com/api-doc/spot/market/Get-Symbols
* @see https://www.bitget.com/api-doc/contract/market/Get-All-Symbols-Contracts
* @see https://www.bitget.com/api-doc/margin/common/support-currencies
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} an array of objects representing market data
*/
func (this *bitget) FetchMarkets(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
if IsTrue(GetValue(this.Options, "adjustForTimeDifference")) {
retRes178012 := (<-this.LoadTimeDifference())
PanicOnError(retRes178012)
}
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var types interface{} = this.SafeValue(this.Options, "fetchMarkets", []interface{}{"spot", "swap"})
if IsTrue(sandboxMode) {
types = []interface{}{"swap"}
}
var promises interface{} = []interface{}{}
var fetchMargins interface{} = false
for i := 0; IsLessThan(i, GetArrayLength(types)); i++ {
var typeVar interface{} = GetValue(types, i)
if IsTrue(IsTrue((IsEqual(typeVar, "swap"))) || IsTrue((IsEqual(typeVar, "future")))) {
var subTypes interface{} = nil
if IsTrue(sandboxMode) {
// the following are simulated trading markets [ 'SUSDT-FUTURES', 'SCOIN-FUTURES', 'SUSDC-FUTURES' ];
subTypes = []interface{}{"SUSDT-FUTURES", "SCOIN-FUTURES", "SUSDC-FUTURES"}
} else {
subTypes = []interface{}{"USDT-FUTURES", "COIN-FUTURES", "USDC-FUTURES"}
}
for j := 0; IsLessThan(j, GetArrayLength(subTypes)); j++ {
AppendToArray(&promises,this.PublicMixGetV2MixMarketContracts(this.Extend(params, map[string]interface{} {
"productType": GetValue(subTypes, j),
})))
}
} else if IsTrue(IsEqual(typeVar, "spot")) {
AppendToArray(&promises,this.PublicSpotGetV2SpotPublicSymbols(params))
fetchMargins = true
AppendToArray(&promises,this.PublicMarginGetV2MarginCurrencies(params))
} else {
panic(NotSupported(Add(Add(Add(this.Id, " does not support "), typeVar), " market")))
}
}
results:= (<-promiseAll(promises))
PanicOnError(results)
var markets interface{} = []interface{}{}
AddElementToObject(this.Options, "crossMarginPairsData", []interface{}{})
AddElementToObject(this.Options, "isolatedMarginPairsData", []interface{}{})
for i := 0; IsLessThan(i, GetArrayLength(results)); i++ {
var res interface{} = this.SafeDict(results, i)
var data interface{} = this.SafeList(res, "data", []interface{}{})
var firstData interface{} = this.SafeDict(data, 0, map[string]interface{} {})
var isBorrowable interface{} = this.SafeString(firstData, "isBorrowable")
if IsTrue(IsTrue(fetchMargins) && IsTrue(!IsEqual(isBorrowable, nil))) {
var keysList interface{} = ObjectKeys(this.IndexBy(data, "symbol"))
AddElementToObject(this.Options, "crossMarginPairsData", keysList)
AddElementToObject(this.Options, "isolatedMarginPairsData", keysList)
} else {
markets = this.ArrayConcat(markets, data)
}
}
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(markets)); i++ {
AppendToArray(&result,this.ParseMarket(GetValue(markets, i)))
}
ch <- result
return nil
}()
return ch
}
func (this *bitget) ParseMarket(market interface{}) interface{} {
//
// spot
//
// {
// "symbol": "TRXUSDT",
// "baseCoin": "TRX",
// "quoteCoin": "USDT",
// "minTradeAmount": "0",
// "maxTradeAmount": "10000000000",
// "takerFeeRate": "0.002",
// "makerFeeRate": "0.002",
// "pricePrecision": "6",
// "quantityPrecision": "4",
// "quotePrecision": "6",
// "status": "online",
// "minTradeUSDT": "5",
// "buyLimitPriceRatio": "0.05",
// "sellLimitPriceRatio": "0.05"
// }
//
// swap and future
//
// {
// "symbol": "BTCUSDT",
// "baseCoin": "BTC",
// "quoteCoin": "USDT",
// "buyLimitPriceRatio": "0.01",
// "sellLimitPriceRatio": "0.01",
// "feeRateUpRatio": "0.005",
// "makerFeeRate": "0.0002",
// "takerFeeRate": "0.0006",
// "openCostUpRatio": "0.01",
// "supportMarginCoins": ["USDT"],
// "minTradeNum": "0.001",
// "priceEndStep": "1",
// "volumePlace": "3",
// "pricePlace": "1",
// "sizeMultiplier": "0.001",
// "symbolType": "perpetual",
// "minTradeUSDT": "5",
// "maxSymbolOrderNum": "200",
// "maxProductOrderNum": "400",
// "maxPositionNum": "150",
// "symbolStatus": "normal",
// "offTime": "-1",
// "limitOpenTime": "-1",
// "deliveryTime": "",
// "deliveryStartTime": "",
// "deliveryPeriod": "",
// "launchTime": "",
// "fundInterval": "8",
// "minLever": "1",
// "maxLever": "125",
// "posLimit": "0.05",
// "maintainTime": ""
// }
//
var marketId interface{} = this.SafeString(market, "symbol")
var quoteId interface{} = this.SafeString(market, "quoteCoin")
var baseId interface{} = this.SafeString(market, "baseCoin")
var quote interface{} = this.SafeCurrencyCode(quoteId)
var base interface{} = this.SafeCurrencyCode(baseId)
var supportMarginCoins interface{} = this.SafeValue(market, "supportMarginCoins", []interface{}{})
var settleId interface{} = nil
if IsTrue(this.InArray(baseId, supportMarginCoins)) {
settleId = baseId
} else if IsTrue(this.InArray(quoteId, supportMarginCoins)) {
settleId = quoteId
} else {
settleId = this.SafeString(supportMarginCoins, 0)
}
var settle interface{} = this.SafeCurrencyCode(settleId)
var symbol interface{} = Add(Add(base, "/"), quote)
var typeVar interface{} = nil
var swap interface{} = false
var spot interface{} = false
var future interface{} = false
var contract interface{} = false
var pricePrecision interface{} = nil
var amountPrecision interface{} = nil
var linear interface{} = nil
var inverse interface{} = nil
var expiry interface{} = nil
var expiryDatetime interface{} = nil
var symbolType interface{} = this.SafeString(market, "symbolType")
var marginModes interface{} = nil
var isMarginTradingAllowed interface{} = false
if IsTrue(IsEqual(symbolType, nil)) {
typeVar = "spot"
spot = true
pricePrecision = this.ParseNumber(this.ParsePrecision(this.SafeString(market, "pricePrecision")))
amountPrecision = this.ParseNumber(this.ParsePrecision(this.SafeString(market, "quantityPrecision")))
var hasCrossMargin interface{} = this.InArray(marketId, GetValue(this.Options, "crossMarginPairsData"))
var hasIsolatedMargin interface{} = this.InArray(marketId, GetValue(this.Options, "isolatedMarginPairsData"))
marginModes = map[string]interface{} {
"cross": hasCrossMargin,
"isolated": hasIsolatedMargin,
}
isMarginTradingAllowed = IsTrue(hasCrossMargin) || IsTrue(hasCrossMargin)
} else {
if IsTrue(IsEqual(symbolType, "perpetual")) {
typeVar = "swap"
swap = true
symbol = Add(Add(symbol, ":"), settle)
} else if IsTrue(IsEqual(symbolType, "delivery")) {
expiry = this.SafeInteger(market, "deliveryTime")
expiryDatetime = this.Iso8601(expiry)
var expiryParts interface{} = Split(expiryDatetime, "-")
var yearPart interface{} = this.SafeString(expiryParts, 0)
var dayPart interface{} = this.SafeString(expiryParts, 2)
var year interface{} = Slice(yearPart, 2, 4)
var month interface{} = this.SafeString(expiryParts, 1)
var day interface{} = Slice(dayPart, 0, 2)
var expiryString interface{} = Add(Add(year, month), day)
typeVar = "future"
future = true
symbol = Add(Add(Add(Add(symbol, ":"), settle), "-"), expiryString)
}
contract = true
inverse = (IsEqual(base, settle))
linear = !IsTrue(inverse)
var priceDecimals interface{} = this.SafeInteger(market, "pricePlace")
var amountDecimals interface{} = this.SafeInteger(market, "volumePlace")
var priceStep interface{} = this.SafeString(market, "priceEndStep")
var amountStep interface{} = this.SafeString(market, "minTradeNum")
precise := NewPrecise(priceStep)
precise.Decimals = mathMax(precise.Decimals, priceDecimals)
precise.Reduce()
var priceString interface{} = precise.ToString()
pricePrecision = this.ParseNumber(priceString)
preciseAmount := NewPrecise(amountStep)
preciseAmount.Decimals = mathMax(preciseAmount.Decimals, amountDecimals)
preciseAmount.Reduce()
var amountString interface{} = preciseAmount.ToString()
amountPrecision = this.ParseNumber(amountString)
marginModes = map[string]interface{} {
"cross": true,
"isolated": true,
}
}
var status interface{} = this.SafeString2(market, "status", "symbolStatus")
var active interface{} = nil
if IsTrue(!IsEqual(status, nil)) {
active = (IsTrue((IsEqual(status, "online"))) || IsTrue((IsEqual(status, "normal"))))
}
var minCost interface{} = nil
if IsTrue(IsEqual(quote, "USDT")) {
minCost = this.SafeNumber(market, "minTradeUSDT")
}
var contractSize interface{} = Ternary(IsTrue(contract), 1, nil)
return map[string]interface{} {
"id": marketId,
"symbol": symbol,
"base": base,
"quote": quote,
"settle": settle,
"baseId": baseId,
"quoteId": quoteId,
"settleId": settleId,
"type": typeVar,
"spot": spot,
"margin": IsTrue(spot) && IsTrue(isMarginTradingAllowed),
"marginModes": marginModes,
"swap": swap,
"future": future,
"option": false,
"active": active,
"contract": contract,
"linear": linear,
"inverse": inverse,
"taker": this.SafeNumber(market, "takerFeeRate"),
"maker": this.SafeNumber(market, "makerFeeRate"),
"contractSize": contractSize,
"expiry": expiry,
"expiryDatetime": expiryDatetime,
"strike": nil,
"optionType": nil,
"precision": map[string]interface{} {
"amount": amountPrecision,
"price": pricePrecision,
},
"limits": map[string]interface{} {
"leverage": map[string]interface{} {
"min": this.SafeNumber(market, "minLever"),
"max": this.SafeNumber(market, "maxLever"),
},
"amount": map[string]interface{} {
"min": this.SafeNumber2(market, "minTradeNum", "minTradeAmount"),
"max": this.SafeNumber(market, "maxTradeAmount"),
},
"price": map[string]interface{} {
"min": nil,
"max": nil,
},
"cost": map[string]interface{} {
"min": minCost,
"max": nil,
},
},
"created": this.SafeInteger(market, "launchTime"),
"info": market,
}
}
/**
* @method
* @name bitget#fetchCurrencies
* @description fetches all available currencies on an exchange
* @see https://www.bitget.com/api-doc/spot/market/Get-Coin-List
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an associative dictionary of currencies
*/
func (this *bitget) FetchCurrencies(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
response:= (<-this.PublicSpotGetV2SpotPublicCoins(params))
PanicOnError(response)
//
// {
// "code": "00000",
// "data": [
// {
// "chains": [
// {
// "browserUrl": "https://blockchair.com/bitcoin/transaction/",
// "chain": "BTC",
// "depositConfirm": "1",
// "extraWithdrawFee": "0",
// "minDepositAmount": "0.0001",
// "minWithdrawAmount": "0.005",
// "needTag": "false",
// "rechargeable": "true",
// "withdrawConfirm": "1",
// "withdrawFee": "0.0004",
// "withdrawable": "true"
// },
// ],
// "coin": "BTC",
// "coinId": "1",
// "transfer": "true""
// }
// ],
// "msg": "success",
// "requestTime": "1700120731773"
// }
//
var result interface{} = map[string]interface{} {}
var data interface{} = this.SafeValue(response, "data", []interface{}{})
for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
var entry interface{} = GetValue(data, i)
var id interface{} = this.SafeString(entry, "coin") // we don't use 'coinId' as it has no use. it is 'coin' field that needs to be used in currency related endpoints (deposit, withdraw, etc..)
var code interface{} = this.SafeCurrencyCode(id)
var chains interface{} = this.SafeValue(entry, "chains", []interface{}{})
var networks interface{} = map[string]interface{} {}
var deposit interface{} = false
var withdraw interface{} = false
var minWithdrawString interface{} = nil
var minDepositString interface{} = nil
var minWithdrawFeeString interface{} = nil
for j := 0; IsLessThan(j, GetArrayLength(chains)); j++ {
var chain interface{} = GetValue(chains, j)
var networkId interface{} = this.SafeString(chain, "chain")
var network interface{} = this.NetworkIdToCode(networkId, code)
if IsTrue(!IsEqual(network, nil)) {
network = ToUpper(network)
}
var withdrawEnabled interface{} = this.SafeString(chain, "withdrawable")
var canWithdraw interface{} = IsEqual(withdrawEnabled, "true")
withdraw = Ternary(IsTrue((canWithdraw)), canWithdraw, withdraw)
var depositEnabled interface{} = this.SafeString(chain, "rechargeable")
var canDeposit interface{} = IsEqual(depositEnabled, "true")
deposit = Ternary(IsTrue((canDeposit)), canDeposit, deposit)
var networkWithdrawFeeString interface{} = this.SafeString(chain, "withdrawFee")
if IsTrue(!IsEqual(networkWithdrawFeeString, nil)) {
minWithdrawFeeString = Ternary(IsTrue((IsEqual(minWithdrawFeeString, nil))), networkWithdrawFeeString, Precise.StringMin(networkWithdrawFeeString, minWithdrawFeeString))
}
var networkMinWithdrawString interface{} = this.SafeString(chain, "minWithdrawAmount")
if IsTrue(!IsEqual(networkMinWithdrawString, nil)) {
minWithdrawString = Ternary(IsTrue((IsEqual(minWithdrawString, nil))), networkMinWithdrawString, Precise.StringMin(networkMinWithdrawString, minWithdrawString))
}
var networkMinDepositString interface{} = this.SafeString(chain, "minDepositAmount")
if IsTrue(!IsEqual(networkMinDepositString, nil)) {
minDepositString = Ternary(IsTrue((IsEqual(minDepositString, nil))), networkMinDepositString, Precise.StringMin(networkMinDepositString, minDepositString))
}
AddElementToObject(networks, network, map[string]interface{} {
"info": chain,
"id": networkId,
"network": network,
"limits": map[string]interface{} {
"withdraw": map[string]interface{} {
"min": this.ParseNumber(networkMinWithdrawString),
"max": nil,
},
"deposit": map[string]interface{} {
"min": this.ParseNumber(networkMinDepositString),
"max": nil,
},
},
"active": IsTrue(canWithdraw) && IsTrue(canDeposit),
"withdraw": canWithdraw,
"deposit": canDeposit,
"fee": this.ParseNumber(networkWithdrawFeeString),
"precision": nil,
})
}
AddElementToObject(result, code, map[string]interface{} {
"info": entry,
"id": id,
"code": code,
"networks": networks,
"type": nil,
"name": nil,
"active": IsTrue(deposit) && IsTrue(withdraw),
"deposit": deposit,
"withdraw": withdraw,
"fee": this.ParseNumber(minWithdrawFeeString),
"precision": nil,
"limits": map[string]interface{} {
"amount": map[string]interface{} {
"min": nil,
"max": nil,
},
"withdraw": map[string]interface{} {
"min": this.ParseNumber(minWithdrawString),
"max": nil,
},
"deposit": map[string]interface{} {
"min": this.ParseNumber(minDepositString),
"max": nil,
},
},
"created": nil,
})
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchMarketLeverageTiers
* @description retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes for a single market
* @see https://www.bitget.com/api-doc/contract/position/Get-Query-Position-Lever
* @see https://www.bitget.com/api-doc/margin/cross/account/Cross-Tier-Data
* @see https://www.bitget.com/api-doc/margin/isolated/account/Isolated-Tier-Data
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.marginMode] for spot margin 'cross' or 'isolated', default is 'isolated'
* @param {string} [params.code] required for cross spot margin
* @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @returns {object} a [leverage tiers structure]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure}
*/
func (this *bitget) FetchMarketLeverageTiers(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes21868 := (<-this.LoadMarkets())
PanicOnError(retRes21868)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {}
var response interface{} = nil
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchMarketLeverageTiers", params, "isolated");
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
if IsTrue(IsTrue((GetValue(market, "swap"))) || IsTrue((GetValue(market, "future")))) {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
AddElementToObject(request, "symbol", GetValue(market, "id"))
response = (<-this.PublicMixGetV2MixMarketQueryPositionLever(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "isolated")) {
AddElementToObject(request, "symbol", GetValue(market, "id"))
response = (<-this.PrivateMarginGetV2MarginIsolatedTierData(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
var code interface{} = this.SafeString(params, "code")
if IsTrue(IsEqual(code, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchMarketLeverageTiers() requires a code argument")))
}
params = this.Omit(params, "code")
var currency interface{} = this.Currency(code)
AddElementToObject(request, "coin", GetValue(currency, "id"))
response = (<-this.PrivateMarginGetV2MarginCrossedTierData(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(BadRequest(Add(Add(this.Id, " fetchMarketLeverageTiers() symbol does not support market "), GetValue(market, "symbol"))))
}
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700290724614,
// "data": [
// {
// "symbol": "BTCUSDT",
// "level": "1",
// "startUnit": "0",
// "endUnit": "150000",
// "leverage": "125",
// "keepMarginRate": "0.004"
// },
// ]
// }
//
// isolated
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700291531894,
// "data": [
// {
// "tier": "1",
// "symbol": "BTCUSDT",
// "leverage": "10",
// "baseCoin": "BTC",
// "quoteCoin": "USDT",
// "baseMaxBorrowableAmount": "2",
// "quoteMaxBorrowableAmount": "24000",
// "maintainMarginRate": "0.05",
// "initRate": "0.1111"
// },
// ]
// }
//
// cross
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700291818831,
// "data": [
// {
// "tier": "1",
// "leverage": "3",
// "coin": "BTC",
// "maxBorrowableAmount": "26",
// "maintainMarginRate": "0.1"
// }
// ]
// }
//
var result interface{} = this.SafeValue(response, "data", []interface{}{})
ch <- this.ParseMarketLeverageTiers(result, market)
return nil
}()
return ch
}
func (this *bitget) ParseMarketLeverageTiers(info interface{}, optionalArgs ...interface{}) interface{} {
//
// swap and future
//
// {
// "symbol": "BTCUSDT",
// "level": "1",
// "startUnit": "0",
// "endUnit": "150000",
// "leverage": "125",
// "keepMarginRate": "0.004"
// }
//
// isolated
//
// {
// "tier": "1",
// "symbol": "BTCUSDT",
// "leverage": "10",
// "baseCoin": "BTC",
// "quoteCoin": "USDT",
// "baseMaxBorrowableAmount": "2",
// "quoteMaxBorrowableAmount": "24000",
// "maintainMarginRate": "0.05",
// "initRate": "0.1111"
// }
//
// cross
//
// {
// "tier": "1",
// "leverage": "3",
// "coin": "BTC",
// "maxBorrowableAmount": "26",
// "maintainMarginRate": "0.1"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var tiers interface{} = []interface{}{}
var minNotional interface{} = 0
for i := 0; IsLessThan(i, GetArrayLength(info)); i++ {
var item interface{} = GetValue(info, i)
var minimumNotional interface{} = this.SafeNumber(item, "startUnit")
if IsTrue(!IsEqual(minimumNotional, nil)) {
minNotional = minimumNotional
}
var maxNotional interface{} = this.SafeNumberN(item, []interface{}{"endUnit", "maxBorrowableAmount", "baseMaxBorrowableAmount"})
var marginCurrency interface{} = this.SafeString2(item, "coin", "baseCoin")
var currencyId interface{} = Ternary(IsTrue((!IsEqual(marginCurrency, nil))), marginCurrency, GetValue(market, "base"))
var marketId interface{} = this.SafeString(item, "symbol")
AppendToArray(&tiers,map[string]interface{} {
"tier": this.SafeInteger2(item, "level", "tier"),
"symbol": this.SafeSymbol(marketId, market),
"currency": this.SafeCurrencyCode(currencyId),
"minNotional": minNotional,
"maxNotional": maxNotional,
"maintenanceMarginRate": this.SafeNumber2(item, "keepMarginRate", "maintainMarginRate"),
"maxLeverage": this.SafeNumber(item, "leverage"),
"info": item,
})
minNotional = maxNotional
}
return tiers
}
/**
* @method
* @name bitget#fetchDeposits
* @description fetch all deposits made to an account
* @see https://www.bitget.com/api-doc/spot/account/Get-Deposit-Record
* @param {string} code unified currency code
* @param {int} [since] the earliest time in ms to fetch deposits for
* @param {int} [limit] the maximum number of deposits structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] end time in milliseconds
* @param {string} [params.idLessThan] return records with id less than the provided value
* @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)
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
func (this *bitget) FetchDeposits(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
code := GetArg(optionalArgs, 0, nil)
_ = code
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes23608 := (<-this.LoadMarkets())
PanicOnError(retRes23608)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchDeposits", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes236419 := (<-this.FetchPaginatedCallCursor("fetchDeposits", nil, since, limit, params, "idLessThan", "idLessThan", nil, 100))
PanicOnError(retRes236419)
ch <- retRes236419
return nil
}
if IsTrue(IsEqual(code, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchDeposits() requires a `code` argument")))
}
var currency interface{} = this.Currency(code)
if IsTrue(IsEqual(since, nil)) {
since = Subtract(this.Milliseconds(), 7776000000) // 90 days
}
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"startTime": since,
"endTime": this.Milliseconds(),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
response:= (<-this.PrivateSpotGetV2SpotWalletDepositRecords(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700528340608,
// "data": [
// {
// "orderId": "1083832260799930368",
// "tradeId": "35bf0e588a42b25c71a9d45abe7308cabdeec6b7b423910b9bd4743d3a9a9efa",
// "coin": "BTC",
// "type": "deposit",
// "size": "0.00030000",
// "status": "success",
// "toAddress": "1BfZh7JESJGBUszCGeZnzxbVVvBycbJSbA",
// "dest": "on_chain",
// "chain": "BTC",
// "fromAddress": null,
// "cTime": "1694131668281",
// "uTime": "1694131680247"
// }
// ]
// }
//
var rawTransactions interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseTransactions(rawTransactions, currency, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#withdraw
* @description make a withdrawal
* @see https://www.bitget.com/api-doc/spot/account/Wallet-Withdrawal
* @param {string} code unified currency code
* @param {float} amount the amount to withdraw
* @param {string} address the address to withdraw to
* @param {string} tag
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.chain] the blockchain network the withdrawal is taking place on
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
func (this *bitget) Withdraw(code interface{}, amount interface{}, address interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
tag := GetArg(optionalArgs, 0, nil)
_ = tag
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
this.CheckAddress(address)
var networkCode interface{} = nil
networkCodeparamsVariable := this.HandleNetworkCodeAndParams(params);
networkCode = GetValue(networkCodeparamsVariable,0);
params = GetValue(networkCodeparamsVariable,1)
if IsTrue(IsEqual(networkCode, nil)) {
panic(ArgumentsRequired(Add(this.Id, " withdraw() requires a \"network\" parameter")))
}
retRes24308 := (<-this.LoadMarkets())
PanicOnError(retRes24308)
var currency interface{} = this.Currency(code)
var networkId interface{} = this.NetworkCodeToId(networkCode)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"address": address,
"chain": networkId,
"size": amount,
"transferType": "on_chain",
}
if IsTrue(!IsEqual(tag, nil)) {
AddElementToObject(request, "tag", tag)
}
response:= (<-this.PrivateSpotPostV2SpotWalletWithdrawal(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code":"00000",
// "msg":"success",
// "requestTime":1696784219602,
// "data": {
// "orderId":"1094957867615789056",
// "clientOid":"64f1e4ce842041d296b4517df1b5c2d7"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var result interface{} = this.ParseTransaction(data, currency)
AddElementToObject(result, "type", "withdrawal")
var withdrawOptions interface{} = this.SafeValue(this.Options, "withdraw", map[string]interface{} {})
var fillResponseFromRequest interface{} = this.SafeBool(withdrawOptions, "fillResponseFromRequest", true)
if IsTrue(fillResponseFromRequest) {
AddElementToObject(result, "currency", code)
AddElementToObject(result, "timestamp", this.Milliseconds())
AddElementToObject(result, "datetime", this.Iso8601(this.Milliseconds()))
AddElementToObject(result, "amount", amount)
AddElementToObject(result, "tag", tag)
AddElementToObject(result, "address", address)
AddElementToObject(result, "addressTo", address)
AddElementToObject(result, "network", networkCode)
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchWithdrawals
* @description fetch all withdrawals made from an account
* @see https://www.bitget.com/api-doc/spot/account/Get-Withdraw-Record
* @param {string} code unified currency code
* @param {int} [since] the earliest time in ms to fetch withdrawals for
* @param {int} [limit] the maximum number of withdrawals structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] end time in milliseconds
* @param {string} [params.idLessThan] return records with id less than the provided value
* @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)
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
func (this *bitget) FetchWithdrawals(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
code := GetArg(optionalArgs, 0, nil)
_ = code
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes24888 := (<-this.LoadMarkets())
PanicOnError(retRes24888)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchWithdrawals", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes249219 := (<-this.FetchPaginatedCallCursor("fetchWithdrawals", nil, since, limit, params, "idLessThan", "idLessThan", nil, 100))
PanicOnError(retRes249219)
ch <- retRes249219
return nil
}
if IsTrue(IsEqual(code, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchWithdrawals() requires a `code` argument")))
}
var currency interface{} = this.Currency(code)
if IsTrue(IsEqual(since, nil)) {
since = Subtract(this.Milliseconds(), 7776000000) // 90 days
}
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"startTime": since,
"endTime": this.Milliseconds(),
}
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PrivateSpotGetV2SpotWalletWithdrawalRecords(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700528340608,
// "data": [
// {
// "orderId": "1083832260799930368",
// "tradeId": "35bf0e588a42b25c71a9d45abe7308cabdeec6b7b423910b9bd4743d3a9a9efa",
// "clientOid": "123",
// "coin": "BTC",
// "type": "withdraw",
// "size": "0.00030000",
// "fee": "-1.0000000",
// "status": "success",
// "toAddress": "1BfZh7JESJGBUszCGeZnzxbVVvBycbJSbA",
// "dest": "on_chain",
// "chain": "BTC",
// "confirm": "100",
// "fromAddress": null,
// "cTime": "1694131668281",
// "uTime": "1694131680247"
// }
// ]
// }
//
var rawTransactions interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseTransactions(rawTransactions, currency, since, limit)
return nil
}()
return ch
}
func (this *bitget) ParseTransaction(transaction interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchDeposits
//
// {
// "orderId": "1083832260799930368",
// "tradeId": "35bf0e588a42b25c71a9d45abe7308cabdeec6b7b423910b9bd4743d3a9a9efa",
// "coin": "BTC",
// "type": "deposit",
// "size": "0.00030000",
// "status": "success",
// "toAddress": "1BfZh7JESJGBUszCGeZnzxbVVvBycbJSbA",
// "dest": "on_chain",
// "chain": "BTC",
// "fromAddress": null,
// "cTime": "1694131668281",
// "uTime": "1694131680247"
// }
//
// fetchWithdrawals
//
// {
// "orderId": "1083832260799930368",
// "tradeId": "35bf0e588a42b25c71a9d45abe7308cabdeec6b7b423910b9bd4743d3a9a9efa",
// "clientOid": "123",
// "coin": "BTC",
// "type": "withdraw",
// "size": "0.00030000",
// "fee": "-1.0000000",
// "status": "success",
// "toAddress": "1BfZh7JESJGBUszCGeZnzxbVVvBycbJSbA",
// "dest": "on_chain",
// "chain": "BTC",
// "confirm": "100",
// "fromAddress": null,
// "cTime": "1694131668281",
// "uTime": "1694131680247"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var currencyId interface{} = this.SafeString(transaction, "coin")
var code interface{} = this.SafeCurrencyCode(currencyId, currency)
var timestamp interface{} = this.SafeInteger(transaction, "cTime")
var networkId interface{} = this.SafeString(transaction, "chain")
var status interface{} = this.SafeString(transaction, "status")
var tag interface{} = this.SafeString(transaction, "tag")
var feeCostString interface{} = this.SafeString(transaction, "fee")
var feeCostAbsString interface{} = Precise.StringAbs(feeCostString)
var fee interface{} = nil
var amountString interface{} = this.SafeString(transaction, "size")
if IsTrue(!IsEqual(feeCostAbsString, nil)) {
fee = map[string]interface{} {
"currency": code,
"cost": this.ParseNumber(feeCostAbsString),
}
amountString = Precise.StringSub(amountString, feeCostAbsString)
}
return map[string]interface{} {
"id": this.SafeString(transaction, "orderId"),
"info": transaction,
"txid": this.SafeString(transaction, "tradeId"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"network": this.NetworkIdToCode(networkId),
"addressFrom": this.SafeString(transaction, "fromAddress"),
"address": this.SafeString(transaction, "toAddress"),
"addressTo": this.SafeString(transaction, "toAddress"),
"amount": this.ParseNumber(amountString),
"type": this.SafeString(transaction, "type"),
"currency": code,
"status": this.ParseTransactionStatus(status),
"updated": this.SafeInteger(transaction, "uTime"),
"tagFrom": nil,
"tag": tag,
"tagTo": tag,
"comment": nil,
"internal": nil,
"fee": fee,
}
}
func (this *bitget) ParseTransactionStatus(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"success": "ok",
"Pending": "pending",
"pending_review": "pending",
"pending_review_fail": "failed",
"reject": "failed",
}
return this.SafeString(statuses, status, status)
}
/**
* @method
* @name bitget#fetchDepositAddress
* @description fetch the deposit address for a currency associated with this account
* @see https://www.bitget.com/api-doc/spot/account/Get-Deposit-Address
* @param {string} code unified currency code
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
*/
func (this *bitget) FetchDepositAddress(code interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes26398 := (<-this.LoadMarkets())
PanicOnError(retRes26398)
var networkCode interface{} = nil
networkCodeparamsVariable := this.HandleNetworkCodeAndParams(params);
networkCode = GetValue(networkCodeparamsVariable,0);
params = GetValue(networkCodeparamsVariable,1)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
}
if IsTrue(!IsEqual(networkCode, nil)) {
AddElementToObject(request, "chain", this.NetworkCodeToId(networkCode, code))
}
response:= (<-this.PrivateSpotGetV2SpotWalletDepositAddress(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700532244807,
// "data": {
// "coin": "BTC",
// "address": "1BfZh7JESJGBUszCGeZnzxbVVvBycbJSbA",
// "chain": "",
// "tag": null,
// "url": "https://blockchair.com/bitcoin/transaction/"
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
ch <- this.ParseDepositAddress(data, currency)
return nil
}()
return ch
}
func (this *bitget) ParseDepositAddress(depositAddress interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "coin": "BTC",
// "address": "1BfZh7JESJGBUszCGeZnzxbVVvBycbJSbA",
// "chain": "",
// "tag": null,
// "url": "https://blockchair.com/bitcoin/transaction/"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var currencyId interface{} = this.SafeString(depositAddress, "coin")
var networkId interface{} = this.SafeString(depositAddress, "chain")
var parsedCurrency interface{} = this.SafeCurrencyCode(currencyId, currency)
var network interface{} = nil
if IsTrue(!IsEqual(networkId, nil)) {
network = this.NetworkIdToCode(networkId, parsedCurrency)
}
return map[string]interface{} {
"info": depositAddress,
"currency": parsedCurrency,
"network": network,
"address": this.SafeString(depositAddress, "address"),
"tag": this.SafeString(depositAddress, "tag"),
}
}
/**
* @method
* @name bitget#fetchOrderBook
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
* @see https://www.bitget.com/api-doc/spot/market/Get-Orderbook
* @see https://www.bitget.com/api-doc/contract/market/Get-Merge-Depth
* @param {string} symbol unified symbol of the market to fetch the order book for
* @param {int} [limit] the maximum amount of order book entries to return
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
*/
func (this *bitget) FetchOrderBook(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
limit := GetArg(optionalArgs, 0, nil)
_ = limit
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes27068 := (<-this.LoadMarkets())
PanicOnError(retRes27068)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
response = (<-this.PublicSpotGetV2SpotMarketOrderbook(this.Extend(request, params)))
PanicOnError(response)
} else {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response = (<-this.PublicMixGetV2MixMarketMergeDepth(this.Extend(request, params)))
PanicOnError(response)
}
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1645854610294,
// "data": {
// "asks": [ [ "39102", "11.026" ] ],
// "bids": [ [ '39100.5', "1.773" ] ],
// "ts": "1645854610294"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var timestamp interface{} = this.SafeInteger(data, "ts")
ch <- this.ParseOrderBook(data, GetValue(market, "symbol"), timestamp)
return nil
}()
return ch
}
func (this *bitget) ParseTicker(ticker interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "symbol": "BTCUSDT",
// "price": "26242",
// "indexPrice": "34867",
// "markPrice": "25555",
// "ts": "1695793390482"
// }
//
// spot: fetchTicker, fetchTickers
//
// {
// "open": "37202.46",
// "symbol": "BTCUSDT",
// "high24h": "37744.75",
// "low24h": "36666",
// "lastPr": "37583.69",
// "quoteVolume": "519127705.303",
// "baseVolume": "13907.0386",
// "usdtVolume": "519127705.302908",
// "ts": "1700532903261",
// "bidPr": "37583.68",
// "askPr": "37583.69",
// "bidSz": "0.0007",
// "askSz": "0.0829",
// "openUtc": "37449.4",
// "changeUtc24h": "0.00359",
// "change24h": "0.00321"
// }
//
// swap and future: fetchTicker
//
// {
// "symbol": "BTCUSDT",
// "lastPr": "37577.2",
// "askPr": "37577.3",
// "bidPr": "37577.2",
// "bidSz": "3.679",
// "askSz": "0.02",
// "high24h": "37765",
// "low24h": "36628.9",
// "ts": "1700533070359",
// "change24h": "0.00288",
// "baseVolume": "108606.181",
// "quoteVolume": "4051316303.9608",
// "usdtVolume": "4051316303.9608",
// "openUtc": "37451.5",
// "changeUtc24h": "0.00336",
// "indexPrice": "37574.489253",
// "fundingRate": "0.0001",
// "holdingAmount": "53464.529",
// "deliveryStartTime": null,
// "deliveryTime": null,
// "deliveryStatus": "",
// "open24h": "37235.7"
// }
//
// swap and future: fetchTickers
//
// {
// "open": "14.9776",
// "symbol": "LINKUSDT",
// "high24h": "15.3942",
// "low24h": "14.3457",
// "lastPr": "14.3748",
// "quoteVolume": "7008612.4299",
// "baseVolume": "469908.8523",
// "usdtVolume": "7008612.42986561",
// "ts": "1700533772309",
// "bidPr": "14.375",
// "askPr": "14.3769",
// "bidSz": "50.004",
// "askSz": "0.7647",
// "openUtc": "14.478",
// "changeUtc24h": "-0.00713",
// "change24h": "-0.04978"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(ticker, "symbol")
var close interface{} = this.SafeString(ticker, "lastPr")
var timestamp interface{} = this.SafeIntegerOmitZero(ticker, "ts") // exchange bitget provided 0
var change interface{} = this.SafeString(ticker, "change24h")
var open24 interface{} = this.SafeString(ticker, "open24")
var open interface{} = this.SafeString(ticker, "open")
var symbol interface{} = nil
var openValue interface{} = nil
if IsTrue(IsEqual(open, nil)) {
symbol = this.SafeSymbol(marketId, market, nil, "contract")
openValue = open24
} else {
symbol = this.SafeSymbol(marketId, market, nil, "spot")
openValue = open
}
return this.SafeTicker(map[string]interface{} {
"symbol": symbol,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"high": this.SafeString(ticker, "high24h"),
"low": this.SafeString(ticker, "low24h"),
"bid": this.SafeString(ticker, "bidPr"),
"bidVolume": this.SafeString(ticker, "bidSz"),
"ask": this.SafeString(ticker, "askPr"),
"askVolume": this.SafeString(ticker, "askSz"),
"vwap": nil,
"open": openValue,
"close": close,
"last": close,
"previousClose": nil,
"change": change,
"percentage": Precise.StringMul(change, "100"),
"average": nil,
"baseVolume": this.SafeString(ticker, "baseVolume"),
"quoteVolume": this.SafeString(ticker, "quoteVolume"),
"indexPrice": this.SafeString(ticker, "indexPrice"),
"markPrice": this.SafeString(ticker, "markPrice"),
"info": ticker,
}, market)
}
/**
* @method
* @name bitget#fetchTicker
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
* @see https://www.bitget.com/api-doc/spot/market/Get-Tickers
* @see https://www.bitget.com/api-doc/contract/market/Get-Ticker
* @param {string} symbol unified symbol of the market to fetch the ticker for
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
*/
func (this *bitget) FetchTicker(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes28788 := (<-this.LoadMarkets())
PanicOnError(retRes28788)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
response = (<-this.PublicSpotGetV2SpotMarketTickers(this.Extend(request, params)))
PanicOnError(response)
} else {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response = (<-this.PublicMixGetV2MixMarketTicker(this.Extend(request, params)))
PanicOnError(response)
}
//
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700532903782,
// "data": [
// {
// "open": "37202.46",
// "symbol": "BTCUSDT",
// "high24h": "37744.75",
// "low24h": "36666",
// "lastPr": "37583.69",
// "quoteVolume": "519127705.303",
// "baseVolume": "13907.0386",
// "usdtVolume": "519127705.302908",
// "ts": "1700532903261",
// "bidPr": "37583.68",
// "askPr": "37583.69",
// "bidSz": "0.0007",
// "askSz": "0.0829",
// "openUtc": "37449.4",
// "changeUtc24h": "0.00359",
// "change24h": "0.00321"
// }
// ]
// }
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700533070357,
// "data": [
// {
// "symbol": "BTCUSDT",
// "lastPr": "37577.2",
// "askPr": "37577.3",
// "bidPr": "37577.2",
// "bidSz": "3.679",
// "askSz": "0.02",
// "high24h": "37765",
// "low24h": "36628.9",
// "ts": "1700533070359",
// "change24h": "0.00288",
// "baseVolume": "108606.181",
// "quoteVolume": "4051316303.9608",
// "usdtVolume": "4051316303.9608",
// "openUtc": "37451.5",
// "changeUtc24h": "0.00336",
// "indexPrice": "37574.489253",
// "fundingRate": "0.0001",
// "holdingAmount": "53464.529",
// "deliveryStartTime": null,
// "deliveryTime": null,
// "deliveryStatus": "",
// "open24h": "37235.7"
// }
// ]
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseTicker(GetValue(data, 0), market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchMarkPrice
* @description fetches the mark price for a specific market
* @see https://www.bitget.com/api-doc/contract/market/Get-Symbol-Price
* @param {string} symbol unified symbol of the market to fetch the ticker for
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
*/
func (this *bitget) FetchMarkPrice(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes29768 := (<-this.LoadMarkets())
PanicOnError(retRes29768)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
panic(NotSupported(Add(this.Id, " fetchMarkPrice() is not supported for spot markets")))
} else {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response = (<-this.PublicMixGetV2MixMarketSymbolPrice(this.Extend(request, params)))
PanicOnError(response)
}
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseTicker(GetValue(data, 0), market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchTickers
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
* @see https://www.bitget.com/api-doc/spot/market/Get-Tickers
* @see https://www.bitget.com/api-doc/contract/market/Get-All-Symbol-Ticker
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.subType] *contract only* 'linear', 'inverse'
* @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
*/
func (this *bitget) FetchTickers(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbols := GetArg(optionalArgs, 0, nil)
_ = symbols
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes30148 := (<-this.LoadMarkets())
PanicOnError(retRes30148)
var market interface{} = nil
if IsTrue(!IsEqual(symbols, nil)) {
var symbol interface{} = this.SafeValue(symbols, 0)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
}
var response interface{} = nil
var request interface{} = map[string]interface{} {}
var typeVar interface{} = nil
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchTickers", market, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
// Calls like `.fetchTickers (undefined, {subType:'inverse'})` should be supported for this exchange, so
// as "options.defaultSubType" is also set in exchange options, we should consider `params.subType`
// with higher priority and only default to spot, if `subType` is not set in params
var passedSubType interface{} = this.SafeString(params, "subType")
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
// only if passedSubType && productType is undefined, then use spot
if IsTrue(IsTrue(IsEqual(typeVar, "spot")) && IsTrue(IsEqual(passedSubType, nil))) {
response = (<-this.PublicSpotGetV2SpotMarketTickers(this.Extend(request, params)))
PanicOnError(response)
} else {
AddElementToObject(request, "productType", productType)
response = (<-this.PublicMixGetV2MixMarketTickers(this.Extend(request, params)))
PanicOnError(response)
}
//
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700532903782,
// "data": [
// {
// "open": "37202.46",
// "symbol": "BTCUSDT",
// "high24h": "37744.75",
// "low24h": "36666",
// "lastPr": "37583.69",
// "quoteVolume": "519127705.303",
// "baseVolume": "13907.0386",
// "usdtVolume": "519127705.302908",
// "ts": "1700532903261",
// "bidPr": "37583.68",
// "askPr": "37583.69",
// "bidSz": "0.0007",
// "askSz": "0.0829",
// "openUtc": "37449.4",
// "changeUtc24h": "0.00359",
// "change24h": "0.00321"
// }
// ]
// }
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700533773477,
// "data": [
// {
// "open": "14.9776",
// "symbol": "LINKUSDT",
// "high24h": "15.3942",
// "low24h": "14.3457",
// "lastPr": "14.3748",
// "quoteVolume": "7008612.4299",
// "baseVolume": "469908.8523",
// "usdtVolume": "7008612.42986561",
// "ts": "1700533772309",
// "bidPr": "14.375",
// "askPr": "14.3769",
// "bidSz": "50.004",
// "askSz": "0.7647",
// "openUtc": "14.478",
// "changeUtc24h": "-0.00713",
// "change24h": "-0.04978"
// },
// ]
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseTickers(data, symbols)
return nil
}()
return ch
}
func (this *bitget) ParseTrade(trade interface{}, optionalArgs ...interface{}) interface{} {
//
// spot, swap and future: fetchTrades
//
// {
// "tradeId": "1075199767891652609",
// "price": "29376.5",
// "size": "6.035",
// "side": "Buy",
// "ts": "1692073521000",
// "symbol": "BTCUSDT"
// }
//
// spot: fetchMyTrades
//
// {
// "userId": "7264631750",
// "symbol": "BTCUSDT",
// "orderId": "1098394344925597696",
// "tradeId": "1098394344974925824",
// "orderType": "market",
// "side": "sell",
// "priceAvg": "28467.68",
// "size": "0.0002",
// "amount": "5.693536",
// "feeDetail": {
// "deduction": "no",
// "feeCoin": "USDT",
// "totalDeductionFee": "",
// "totalFee": "-0.005693536"
// },
// "tradeScope": "taker",
// "cTime": "1697603539699",
// "uTime": "1697603539754"
// }
//
// spot margin: fetchMyTrades
//
// {
// "orderId": "1099353730455318528",
// "tradeId": "1099353730627092481",
// "orderType": "market",
// "side": "sell",
// "priceAvg": "29543.7",
// "size": "0.0001",
// "amount": "2.95437",
// "tradeScope": "taker",
// "feeDetail": {
// "deduction": "no",
// "feeCoin": "USDT",
// "totalDeductionFee": "0",
// "totalFee": "-0.00295437"
// },
// "cTime": "1697832275063",
// "uTime": "1697832275150"
// }
//
// swap and future: fetchMyTrades
//
// {
// "tradeId": "1111468664328269825",
// "symbol": "BTCUSDT",
// "orderId": "1111468664264753162",
// "price": "37271.4",
// "baseVolume": "0.001",
// "feeDetail": [
// {
// "deduction": "no",
// "feeCoin": "USDT",
// "totalDeductionFee": null,
// "totalFee": "-0.02236284"
// }
// ],
// "side": "buy",
// "quoteVolume": "37.2714",
// "profit": "-0.0007",
// "enterPointSource": "web",
// "tradeSide": "close",
// "posMode": "hedge_mode",
// "tradeScope": "taker",
// "cTime": "1700720700342"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(trade, "symbol")
var symbol interface{} = this.SafeSymbol(marketId, market)
var timestamp interface{} = this.SafeInteger2(trade, "cTime", "ts")
var fee interface{} = nil
var feeDetail interface{} = this.SafeValue(trade, "feeDetail")
var posMode interface{} = this.SafeString(trade, "posMode")
var feeStructure interface{} = Ternary(IsTrue((!IsEqual(posMode, nil))), GetValue(feeDetail, 0), feeDetail)
if IsTrue(!IsEqual(feeStructure, nil)) {
var currencyCode interface{} = this.SafeCurrencyCode(this.SafeString(feeStructure, "feeCoin"))
fee = map[string]interface{} {
"currency": currencyCode,
}
var feeCostString interface{} = this.SafeString(feeStructure, "totalFee")
var deduction interface{} = Ternary(IsTrue(IsEqual(this.SafeString(feeStructure, "deduction"), "yes")), true, false)
if IsTrue(deduction) {
AddElementToObject(fee, "cost", feeCostString)
} else {
AddElementToObject(fee, "cost", Precise.StringNeg(feeCostString))
}
}
return this.SafeTrade(map[string]interface{} {
"info": trade,
"id": this.SafeString(trade, "tradeId"),
"order": this.SafeString(trade, "orderId"),
"symbol": symbol,
"side": this.SafeStringLower(trade, "side"),
"type": this.SafeString(trade, "orderType"),
"takerOrMaker": this.SafeString(trade, "tradeScope"),
"price": this.SafeString2(trade, "priceAvg", "price"),
"amount": this.SafeString2(trade, "baseVolume", "size"),
"cost": this.SafeString2(trade, "quoteVolume", "amount"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"fee": fee,
}, market)
}
/**
* @method
* @name bitget#fetchTrades
* @description get the list of most recent trades for a particular symbol
* @see https://www.bitget.com/api-doc/spot/market/Get-Recent-Trades
* @see https://www.bitget.com/api-doc/spot/market/Get-Market-Trades
* @see https://www.bitget.com/api-doc/contract/market/Get-Recent-Fills
* @see https://www.bitget.com/api-doc/contract/market/Get-Fills-History
* @param {string} symbol unified symbol of the market to fetch trades for
* @param {int} [since] timestamp in ms of the earliest trade to fetch
* @param {int} [limit] the maximum amount of trades to fetch
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] *only applies to publicSpotGetV2SpotMarketFillsHistory and publicMixGetV2MixMarketFillsHistory* the latest time in ms to fetch trades for
* @param {boolean} [params.paginate] *only applies to publicSpotGetV2SpotMarketFillsHistory and publicMixGetV2MixMarketFillsHistory* default false, when true will automatically paginate by calling this endpoint multiple times
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
*/
func (this *bitget) FetchTrades(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
since := GetArg(optionalArgs, 0, nil)
_ = since
limit := GetArg(optionalArgs, 1, nil)
_ = limit
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
retRes32418 := (<-this.LoadMarkets())
PanicOnError(retRes32418)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchTrades", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes324519 := (<-this.FetchPaginatedCallCursor("fetchTrades", symbol, since, limit, params, "idLessThan", "idLessThan"))
PanicOnError(retRes324519)
ch <- retRes324519
return nil
}
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
if IsTrue(!IsEqual(limit, nil)) {
if IsTrue(GetValue(market, "contract")) {
AddElementToObject(request, "limit", mathMin(limit, 1000))
} else {
AddElementToObject(request, "limit", limit)
}
}
var options interface{} = this.SafeValue(this.Options, "fetchTrades", map[string]interface{} {})
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
var spotOptions interface{} = this.SafeValue(options, "spot", map[string]interface{} {})
var defaultSpotMethod interface{} = this.SafeString(spotOptions, "method", "publicSpotGetV2SpotMarketFillsHistory")
var spotMethod interface{} = this.SafeString(params, "method", defaultSpotMethod)
params = this.Omit(params, "method")
if IsTrue(IsEqual(spotMethod, "publicSpotGetV2SpotMarketFillsHistory")) {
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
response = (<-this.PublicSpotGetV2SpotMarketFillsHistory(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(spotMethod, "publicSpotGetV2SpotMarketFills")) {
response = (<-this.PublicSpotGetV2SpotMarketFills(this.Extend(request, params)))
PanicOnError(response)
}
} else {
var swapOptions interface{} = this.SafeValue(options, "swap", map[string]interface{} {})
var defaultSwapMethod interface{} = this.SafeString(swapOptions, "method", "publicMixGetV2MixMarketFillsHistory")
var swapMethod interface{} = this.SafeString(params, "method", defaultSwapMethod)
params = this.Omit(params, "method")
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
if IsTrue(IsEqual(swapMethod, "publicMixGetV2MixMarketFillsHistory")) {
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
response = (<-this.PublicMixGetV2MixMarketFillsHistory(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(swapMethod, "publicMixGetV2MixMarketFills")) {
response = (<-this.PublicMixGetV2MixMarketFills(this.Extend(request, params)))
PanicOnError(response)
}
}
//
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1692073693562,
// "data": [
// {
// "symbol": "BTCUSDT_SPBL",
// "tradeId": "1075200479040323585",
// "side": "Sell",
// "price": "29381.54",
// "size": "0.0056",
// "ts": "1692073691000"
// },
// ]
// }
//
// swap
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1692073522689,
// "data": [
// {
// "tradeId": "1075199767891652609",
// "price": "29376.5",
// "size": "6.035",
// "side": "Buy",
// "ts": "1692073521000",
// "symbol": "BTCUSDT_UMCBL"
// },
// ]
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseTrades(data, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchTradingFee
* @description fetch the trading fees for a market
* @see https://www.bitget.com/api-doc/common/public/Get-Trade-Rate
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.marginMode] 'isolated' or 'cross', for finding the fee rate of spot margin trading pairs
* @returns {object} a [fee structure]{@link https://docs.ccxt.com/#/?id=fee-structure}
*/
func (this *bitget) FetchTradingFee(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes33518 := (<-this.LoadMarkets())
PanicOnError(retRes33518)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchTradingFee", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
if IsTrue(GetValue(market, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
AddElementToObject(request, "businessType", "margin")
} else {
AddElementToObject(request, "businessType", "spot")
}
} else {
AddElementToObject(request, "businessType", "contract")
}
response:= (<-this.PrivateCommonGetV2CommonTradeRate(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700549524887,
// "data": {
// "makerFeeRate": "0.001",
// "takerFeeRate": "0.001"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
ch <- this.ParseTradingFee(data, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchTradingFees
* @description fetch the trading fees for multiple markets
* @see https://www.bitget.com/api-doc/spot/market/Get-Symbols
* @see https://www.bitget.com/api-doc/contract/market/Get-All-Symbols-Contracts
* @see https://www.bitget.com/api-doc/margin/common/support-currencies
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @param {boolean} [params.margin] set to true for spot margin
* @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols
*/
func (this *bitget) FetchTradingFees(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes33968 := (<-this.LoadMarkets())
PanicOnError(retRes33968)
var response interface{} = nil
var marginMode interface{} = nil
var marketType interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchTradingFees", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchTradingFees", nil, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
if IsTrue(IsEqual(marketType, "spot")) {
var margin interface{} = this.SafeBool(params, "margin", false)
params = this.Omit(params, "margin")
if IsTrue(IsTrue((!IsEqual(marginMode, nil))) || IsTrue(margin)) {
response = (<-this.PublicMarginGetV2MarginCurrencies(params))
PanicOnError(response)
} else {
response = (<-this.PublicSpotGetV2SpotPublicSymbols(params))
PanicOnError(response)
}
} else if IsTrue(IsTrue((IsEqual(marketType, "swap"))) || IsTrue((IsEqual(marketType, "future")))) {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(nil, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(params, "productType", productType)
response = (<-this.PublicMixGetV2MixMarketContracts(params))
PanicOnError(response)
} else {
panic(NotSupported(Add(Add(Add(this.Id, " does not support "), marketType), " market")))
}
//
// spot and margin
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700102364653,
// "data": [
// {
// "symbol": "TRXUSDT",
// "baseCoin": "TRX",
// "quoteCoin": "USDT",
// "minTradeAmount": "0",
// "maxTradeAmount": "10000000000",
// "takerFeeRate": "0.002",
// "makerFeeRate": "0.002",
// "pricePrecision": "6",
// "quantityPrecision": "4",
// "quotePrecision": "6",
// "status": "online",
// "minTradeUSDT": "5",
// "buyLimitPriceRatio": "0.05",
// "sellLimitPriceRatio": "0.05"
// },
// ]
// }
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700102364709,
// "data": [
// {
// "symbol": "BTCUSDT",
// "baseCoin": "BTC",
// "quoteCoin": "USDT",
// "buyLimitPriceRatio": "0.01",
// "sellLimitPriceRatio": "0.01",
// "feeRateUpRatio": "0.005",
// "makerFeeRate": "0.0002",
// "takerFeeRate": "0.0006",
// "openCostUpRatio": "0.01",
// "supportMarginCoins": ["USDT"],
// "minTradeNum": "0.001",
// "priceEndStep": "1",
// "volumePlace": "3",
// "pricePlace": "1",
// "sizeMultiplier": "0.001",
// "symbolType": "perpetual",
// "minTradeUSDT": "5",
// "maxSymbolOrderNum": "200",
// "maxProductOrderNum": "400",
// "maxPositionNum": "150",
// "symbolStatus": "normal",
// "offTime": "-1",
// "limitOpenTime": "-1",
// "deliveryTime": "",
// "deliveryStartTime": "",
// "deliveryPeriod": "",
// "launchTime": "",
// "fundInterval": "8",
// "minLever": "1",
// "maxLever": "125",
// "posLimit": "0.05",
// "maintainTime": ""
// },
// ]
// }
//
var data interface{} = this.SafeValue(response, "data", []interface{}{})
var result interface{} = map[string]interface{} {}
for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
var entry interface{} = GetValue(data, i)
var marketId interface{} = this.SafeString(entry, "symbol")
var symbol interface{} = this.SafeSymbol(marketId, nil, nil, marketType)
var market interface{} = this.Market(symbol)
var fee interface{} = this.ParseTradingFee(entry, market)
AddElementToObject(result, symbol, fee)
}
ch <- result
return nil
}()
return ch
}
func (this *bitget) ParseTradingFee(data interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(data, "symbol")
return map[string]interface{} {
"info": data,
"symbol": this.SafeSymbol(marketId, market),
"maker": this.SafeNumber(data, "makerFeeRate"),
"taker": this.SafeNumber(data, "takerFeeRate"),
"percentage": nil,
"tierBased": nil,
}
}
func (this *bitget) ParseOHLCV(ohlcv interface{}, optionalArgs ...interface{}) interface{} {
//
// [
// "1645911960000",
// "39406",
// "39407",
// "39374.5",
// "39379",
// "35.526",
// "1399132.341"
// ]
//
market := GetArg(optionalArgs, 0, nil)
_ = market
return []interface{}{this.SafeInteger(ohlcv, 0), this.SafeNumber(ohlcv, 1), this.SafeNumber(ohlcv, 2), this.SafeNumber(ohlcv, 3), this.SafeNumber(ohlcv, 4), this.SafeNumber(ohlcv, 5)}
}
/**
* @method
* @name bitget#fetchOHLCV
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
* @see https://www.bitget.com/api-doc/spot/market/Get-Candle-Data
* @see https://www.bitget.com/api-doc/spot/market/Get-History-Candle-Data
* @see https://www.bitget.com/api-doc/contract/market/Get-Candle-Data
* @see https://www.bitget.com/api-doc/contract/market/Get-History-Candle-Data
* @see https://www.bitget.com/api-doc/contract/market/Get-History-Index-Candle-Data
* @see https://www.bitget.com/api-doc/contract/market/Get-History-Mark-Candle-Data
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
* @param {string} timeframe the length of time each candle represents
* @param {int} [since] timestamp in ms of the earliest candle to fetch
* @param {int} [limit] the maximum amount of candles to fetch
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] timestamp in ms of the latest candle to fetch
* @param {boolean} [params.useHistoryEndpoint] whether to force to use historical endpoint (it has max limit of 200)
* @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)
* @param {string} [params.price] *swap only* "mark" (to fetch mark price candles) or "index" (to fetch index price candles)
* @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
*/
func (this *bitget) FetchOHLCV(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
timeframe := GetArg(optionalArgs, 0, "1m")
_ = timeframe
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes35588 := (<-this.LoadMarkets())
PanicOnError(retRes35588)
var defaultLimit interface{} = 100 // default 100, max 1000
var maxLimitForRecentEndpoint interface{} = 1000
var maxLimitForHistoryEndpoint interface{} = 200 // note, max 1000 bars are supported for "recent-candles" endpoint, but "historical-candles" support only max 200
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchOHLCV", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes356519 := (<-this.FetchPaginatedCallDeterministic("fetchOHLCV", symbol, since, limit, timeframe, params, maxLimitForRecentEndpoint))
PanicOnError(retRes356519)
ch <- retRes356519
return nil
}
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var useHistoryEndpoint interface{} = this.SafeBool(params, "useHistoryEndpoint", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var marketType interface{} = Ternary(IsTrue(GetValue(market, "spot")), "spot", "swap")
var timeframes interface{} = GetValue(GetValue(this.Options, "timeframes"), marketType)
var msInDay interface{} = 86400000
var duration interface{} = Multiply(this.ParseTimeframe(timeframe), 1000)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"granularity": this.SafeString(timeframes, timeframe, timeframe),
}
var until interface{} = this.SafeInteger(params, "until")
var limitDefined interface{} = !IsEqual(limit, nil)
var sinceDefined interface{} = !IsEqual(since, nil)
var untilDefined interface{} = !IsEqual(until, nil)
params = this.Omit(params, []interface{}{"until"})
var response interface{} = nil
var now interface{} = this.Milliseconds()
// retrievable periods listed here:
// - https://www.bitget.com/api-doc/spot/market/Get-Candle-Data#request-parameters
// - https://www.bitget.com/api-doc/contract/market/Get-Candle-Data#description
var ohlcOptions interface{} = this.SafeDict(this.Options, "fetchOHLCV", map[string]interface{} {})
var retrievableDaysMap interface{} = this.SafeDict(ohlcOptions, "maxDaysPerTimeframe", map[string]interface{} {})
var maxRetrievableDaysForRecent interface{} = this.SafeInteger(retrievableDaysMap, timeframe, 30) // default to safe minimum
var endpointTsBoundary interface{} = Subtract(now, Multiply((Subtract(maxRetrievableDaysForRecent, 1)), msInDay))
if IsTrue(limitDefined) {
limit = mathMin(limit, maxLimitForRecentEndpoint)
AddElementToObject(request, "limit", limit)
} else {
limit = defaultLimit
}
var limitMultipliedDuration interface{} = Multiply(limit, duration)
// exchange aligns from endTime, so it's important, not startTime
// startTime is supported only on "recent" endpoint, not on "historical" endpoint
var calculatedStartTime interface{} = nil
var calculatedEndTime interface{} = nil
if IsTrue(sinceDefined) {
calculatedStartTime = since
AddElementToObject(request, "startTime", since)
if !IsTrue(untilDefined) {
calculatedEndTime = this.Sum(calculatedStartTime, limitMultipliedDuration)
AddElementToObject(request, "endTime", calculatedEndTime)
}
}
if IsTrue(untilDefined) {
calculatedEndTime = until
AddElementToObject(request, "endTime", calculatedEndTime)
if !IsTrue(sinceDefined) {
calculatedStartTime = Subtract(calculatedEndTime, limitMultipliedDuration)
}
}
var historicalEndpointNeeded interface{} = IsTrue((!IsEqual(calculatedStartTime, nil))) && IsTrue((IsLessThanOrEqual(calculatedStartTime, endpointTsBoundary)))
if IsTrue(historicalEndpointNeeded) {
// only for "historical-candles" - ensure we use correct max limit
if IsTrue(limitDefined) {
AddElementToObject(request, "limit", mathMin(limit, maxLimitForHistoryEndpoint))
}
}
// make request
if IsTrue(GetValue(market, "spot")) {
// checks if we need history endpoint
if IsTrue(IsTrue(historicalEndpointNeeded) || IsTrue(useHistoryEndpoint)) {
response = (<-this.PublicSpotGetV2SpotMarketHistoryCandles(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PublicSpotGetV2SpotMarketCandles(this.Extend(request, params)))
PanicOnError(response)
}
} else {
var maxDistanceDaysForContracts interface{} = 90 // for contract, maximum 90 days allowed between start-end times
// only correct the request to fix 90 days if until was auto-calculated
if IsTrue(sinceDefined) {
if !IsTrue(untilDefined) {
AddElementToObject(request, "endTime", mathMin(calculatedEndTime, this.Sum(since, Multiply(maxDistanceDaysForContracts, msInDay))))
} else if IsTrue(IsGreaterThan(Subtract(calculatedEndTime, calculatedStartTime), Multiply(maxDistanceDaysForContracts, msInDay))) {
panic(BadRequest(Add(Add(Add(this.Id, " fetchOHLCV() between start and end must be less than "), ToString(maxDistanceDaysForContracts)), " days")))
}
}
var priceType interface{} = nil
priceTypeparamsVariable := this.HandleParamString(params, "price");
priceType = GetValue(priceTypeparamsVariable,0);
params = GetValue(priceTypeparamsVariable,1)
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
var extended interface{} = this.Extend(request, params)
// todo: mark & index also have their "recent" endpoints, but not priority now.
if IsTrue(IsEqual(priceType, "mark")) {
response = (<-this.PublicMixGetV2MixMarketHistoryMarkCandles(extended))
PanicOnError(response)
} else if IsTrue(IsEqual(priceType, "index")) {
response = (<-this.PublicMixGetV2MixMarketHistoryIndexCandles(extended))
PanicOnError(response)
} else {
if IsTrue(IsTrue(historicalEndpointNeeded) || IsTrue(useHistoryEndpoint)) {
response = (<-this.PublicMixGetV2MixMarketHistoryCandles(extended))
PanicOnError(response)
} else {
response = (<-this.PublicMixGetV2MixMarketCandles(extended))
PanicOnError(response)
}
}
}
if IsTrue(IsEqual(response, "")) {
ch <- []interface{}{} // happens when a new token is listed
return nil
}
// [ ["1645911960000","39406","39407","39374.5","39379","35.526","1399132.341"] ]
var data interface{} = this.SafeList(response, "data", response)
ch <- this.ParseOHLCVs(data, market, timeframe, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchBalance
* @description query for balance and get the amount of funds available for trading or funds locked in orders
* @see https://www.bitget.com/api-doc/spot/account/Get-Account-Assets
* @see https://www.bitget.com/api-doc/contract/account/Get-Account-List
* @see https://www.bitget.com/api-doc/margin/cross/account/Get-Cross-Assets
* @see https://www.bitget.com/api-doc/margin/isolated/account/Get-Isolated-Assets
* @see https://bitgetlimited.github.io/apidoc/en/margin/#get-cross-assets
* @see https://bitgetlimited.github.io/apidoc/en/margin/#get-isolated-assets
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
*/
func (this *bitget) FetchBalance(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes36928 := (<-this.LoadMarkets())
PanicOnError(retRes36928)
var request interface{} = map[string]interface{} {}
var marketType interface{} = nil
var marginMode interface{} = nil
var response interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchBalance", nil, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchBalance", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
if IsTrue(IsTrue((IsEqual(marketType, "swap"))) || IsTrue((IsEqual(marketType, "future")))) {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(nil, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response = (<-this.PrivateMixGetV2MixAccountAccounts(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "isolated")) {
response = (<-this.PrivateMarginGetMarginV1IsolatedAccountAssets(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginGetMarginV1CrossAccountAssets(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marketType, "spot")) {
response = (<-this.PrivateSpotGetV2SpotAccountAssets(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(NotSupported(Add(Add(Add(this.Id, " fetchBalance() does not support "), marketType), " accounts")))
}
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700623852854,
// "data": [
// {
// "coin": "USDT",
// "available": "0.00000000",
// "limitAvailable": "0",
// "frozen": "0.00000000",
// "locked": "0.00000000",
// "uTime": "1699937566000"
// }
// ]
// }
//
// swap
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700625127294,
// "data": [
// {
// "marginCoin": "USDT",
// "locked": "0",
// "available": "0",
// "crossedMaxAvailable": "0",
// "isolatedMaxAvailable": "0",
// "maxTransferOut": "0",
// "accountEquity": "0",
// "usdtEquity": "0.000000005166",
// "btcEquity": "0",
// "crossedRiskRate": "0",
// "unrealizedPL": "0",
// "coupon": "0",
// "crossedUnrealizedPL": null,
// "isolatedUnrealizedPL": null
// }
// ]
// }
//
// isolated margin
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1697501436571,
// "data": [
// {
// "symbol": "BTCUSDT",
// "coin": "BTC",
// "totalAmount": "0.00021654",
// "available": "0.00021654",
// "transferable": "0.00021654",
// "frozen": "0",
// "borrow": "0",
// "interest": "0",
// "net": "0.00021654",
// "ctime": "1697248128071"
// },
// ]
// }
//
// cross margin
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1697515463804,
// "data": [
// {
// "coin": "BTC",
// "totalAmount": "0.00024996",
// "available": "0.00024996",
// "transferable": "0.00004994",
// "frozen": "0",
// "borrow": "0.0001",
// "interest": "0.00000001",
// "net": "0.00014995",
// "ctime": "1697251265504"
// },
// ]
// }
//
var data interface{} = this.SafeValue(response, "data", []interface{}{})
ch <- this.ParseBalance(data)
return nil
}()
return ch
}
func (this *bitget) ParseBalance(balance interface{}) interface{} {
var result interface{} = map[string]interface{} {
"info": balance,
}
//
// spot
//
// {
// "coin": "USDT",
// "available": "0.00000000",
// "limitAvailable": "0",
// "frozen": "0.00000000",
// "locked": "0.00000000",
// "uTime": "1699937566000"
// }
//
// swap
//
// {
// "marginCoin": "USDT",
// "locked": "0",
// "available": "0",
// "crossedMaxAvailable": "0",
// "isolatedMaxAvailable": "0",
// "maxTransferOut": "0",
// "accountEquity": "0",
// "usdtEquity": "0.000000005166",
// "btcEquity": "0",
// "crossedRiskRate": "0",
// "unrealizedPL": "0",
// "coupon": "0",
// "crossedUnrealizedPL": null,
// "isolatedUnrealizedPL": null
// }
//
// isolated margin
//
// {
// "symbol": "BTCUSDT",
// "coin": "BTC",
// "totalAmount": "0.00021654",
// "available": "0.00021654",
// "transferable": "0.00021654",
// "frozen": "0",
// "borrow": "0",
// "interest": "0",
// "net": "0.00021654",
// "ctime": "1697248128071"
// }
//
// cross margin
//
// {
// "coin": "BTC",
// "totalAmount": "0.00024995",
// "available": "0.00024995",
// "transferable": "0.00004993",
// "frozen": "0",
// "borrow": "0.0001",
// "interest": "0.00000001",
// "net": "0.00014994",
// "ctime": "1697251265504"
// }
//
for i := 0; IsLessThan(i, GetArrayLength(balance)); i++ {
var entry interface{} = GetValue(balance, i)
var account interface{} = this.Account()
var currencyId interface{} = this.SafeString2(entry, "marginCoin", "coin")
var code interface{} = this.SafeCurrencyCode(currencyId)
var borrow interface{} = this.SafeString(entry, "borrow")
if IsTrue(!IsEqual(borrow, nil)) {
var interest interface{} = this.SafeString(entry, "interest")
AddElementToObject(account, "free", this.SafeString(entry, "transferable"))
AddElementToObject(account, "total", this.SafeString(entry, "totalAmount"))
AddElementToObject(account, "debt", Precise.StringAdd(borrow, interest))
} else {
// Use transferable instead of available for swap and margin https://github.com/ccxt/ccxt/pull/19127
var spotAccountFree interface{} = this.SafeString(entry, "available")
var contractAccountFree interface{} = this.SafeString(entry, "maxTransferOut")
if IsTrue(!IsEqual(contractAccountFree, nil)) {
AddElementToObject(account, "free", contractAccountFree)
AddElementToObject(account, "total", this.SafeString(entry, "accountEquity"))
} else {
AddElementToObject(account, "free", spotAccountFree)
var frozen interface{} = this.SafeString(entry, "frozen")
var locked interface{} = this.SafeString(entry, "locked")
AddElementToObject(account, "used", Precise.StringAdd(frozen, locked))
}
}
AddElementToObject(result, code, account)
}
return this.SafeBalance(result)
}
func (this *bitget) ParseOrderStatus(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"new": "open",
"init": "open",
"not_trigger": "open",
"partial_fill": "open",
"partially_fill": "open",
"partially_filled": "open",
"triggered": "closed",
"full_fill": "closed",
"filled": "closed",
"fail_trigger": "rejected",
"cancel": "canceled",
"cancelled": "canceled",
"canceled": "canceled",
"live": "open",
"fail_execute": "rejected",
"executed": "closed",
}
return this.SafeString(statuses, status, status)
}
func (this *bitget) ParseOrder(order interface{}, optionalArgs ...interface{}) interface{} {
//
// createOrder, editOrder, closePosition
//
// {
// "clientOid": "abe95dbe-6081-4a6f-a2d3-ae49601cd479",
// "orderId": null
// }
//
// createOrders
//
// [
// {
// "orderId": "1111397214281175046",
// "clientOid": "766d3fc3-7321-4406-a689-15c9987a2e75"
// },
// {
// "orderId": "",
// "clientOid": "d1b75cb3-cc15-4ede-ad4c-3937396f75ab",
// "errorMsg": "less than the minimum amount 5 USDT",
// "errorCode": "45110"
// },
// ]
//
// spot, swap, future and spot margin: cancelOrder, cancelOrders
//
// {
// "orderId": "1098758604547850241",
// "clientOid": "1098758604585598977"
// }
//
// spot trigger: cancelOrder
//
// {
// "result": "success"
// }
//
// spot: fetchOrder
//
// {
// "userId": "7264631750",
// "symbol": "BTCUSDT",
// "orderId": "1111461743123927040",
// "clientOid": "63f95110-93b5-4309-8f77-46339f1bcf3c",
// "price": "25000.0000000000000000",
// "size": "0.0002000000000000",
// "orderType": "limit",
// "side": "buy",
// "status": "live",
// "priceAvg": "0",
// "baseVolume": "0.0000000000000000",
// "quoteVolume": "0.0000000000000000",
// "enterPointSource": "API",
// "feeDetail": "",
// "orderSource": "normal",
// "cTime": "1700719050198",
// "uTime": "1700719050198"
// }
//
// swap and future: fetchOrder
//
// {
// "symbol": "BTCUSDT",
// "size": "0.001",
// "orderId": "1111465253393825792",
// "clientOid": "1111465253431574529",
// "baseVolume": "0",
// "fee": "0",
// "price": "27000",
// "priceAvg": "",
// "state": "live",
// "side": "buy",
// "force": "gtc",
// "totalProfits": "0",
// "posSide": "long",
// "marginCoin": "USDT",
// "presetStopSurplusPrice": "",
// "presetStopLossPrice": "",
// "quoteVolume": "0",
// "orderType": "limit",
// "leverage": "20",
// "marginMode": "crossed",
// "reduceOnly": "NO",
// "enterPointSource": "API",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderSource": "normal",
// "cTime": "1700719887120",
// "uTime": "1700719887120"
// }
//
// spot: fetchOpenOrders
//
// {
// "userId": "7264631750",
// "symbol": "BTCUSDT",
// "orderId": "1111499608327360513",
// "clientOid": "d0d4dad5-18d0-4869-a074-ec40bb47cba6",
// "priceAvg": "25000.0000000000000000",
// "size": "0.0002000000000000",
// "orderType": "limit",
// "side": "buy",
// "status": "live",
// "basePrice": "0",
// "baseVolume": "0.0000000000000000",
// "quoteVolume": "0.0000000000000000",
// "enterPointSource": "WEB",
// "orderSource": "normal",
// "cTime": "1700728077966",
// "uTime": "1700728077966"
// }
//
// spot stop: fetchOpenOrders, fetchCanceledAndClosedOrders
//
// {
// "orderId": "1111503385931620352",
// "clientOid": "1111503385910648832",
// "symbol": "BTCUSDT",
// "size": "0.0002",
// "planType": "AMOUNT",
// "executePrice": "25000",
// "triggerPrice": "26000",
// "status": "live",
// "orderType": "limit",
// "side": "buy",
// "triggerType": "fill_price",
// "enterPointSource": "API",
// "cTime": "1700728978617",
// "uTime": "1700728978617"
// }
//
// spot margin: fetchOpenOrders, fetchCanceledAndClosedOrders
//
// {
// "symbol": "BTCUSDT",
// "orderType": "limit",
// "enterPointSource": "WEB",
// "orderId": "1111506377509580801",
// "clientOid": "2043a3b59a60445f9d9f7365bf3e960c",
// "loanType": "autoLoanAndRepay",
// "price": "25000",
// "side": "buy",
// "status": "live",
// "baseSize": "0.0002",
// "quoteSize": "5",
// "priceAvg": "0",
// "size": "0",
// "amount": "0",
// "force": "gtc",
// "cTime": "1700729691866",
// "uTime": "1700729691866"
// }
//
// swap: fetchOpenOrders, fetchCanceledAndClosedOrders
//
// {
// "symbol": "BTCUSDT",
// "size": "0.002",
// "orderId": "1111488897767604224",
// "clientOid": "1111488897805352960",
// "baseVolume": "0",
// "fee": "0",
// "price": "25000",
// "priceAvg": "",
// "status": "live",
// "side": "buy",
// "force": "gtc",
// "totalProfits": "0",
// "posSide": "long",
// "marginCoin": "USDT",
// "quoteVolume": "0",
// "leverage": "20",
// "marginMode": "crossed",
// "enterPointSource": "web",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderType": "limit",
// "orderSource": "normal",
// "presetStopSurplusPrice": "",
// "presetStopLossPrice": "",
// "reduceOnly": "NO",
// "cTime": "1700725524378",
// "uTime": "1700725524378"
// }
//
// swap stop: fetchOpenOrders
//
// {
// "planType": "normal_plan",
// "symbol": "BTCUSDT",
// "size": "0.001",
// "orderId": "1111491399869075457",
// "clientOid": "1111491399869075456",
// "price": "27000",
// "callbackRatio": "",
// "triggerPrice": "24000",
// "triggerType": "mark_price",
// "planStatus": "live",
// "side": "buy",
// "posSide": "long",
// "marginCoin": "USDT",
// "marginMode": "crossed",
// "enterPointSource": "API",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderType": "limit",
// "stopSurplusTriggerPrice": "",
// "stopSurplusExecutePrice": "",
// "stopSurplusTriggerType": "fill_price",
// "stopLossTriggerPrice": "",
// "stopLossExecutePrice": "",
// "stopLossTriggerType": "fill_price",
// "cTime": "1700726120917",
// "uTime": "1700726120917"
// }
//
// spot: fetchCanceledAndClosedOrders
//
// {
// "userId": "7264631750",
// "symbol": "BTCUSDT",
// "orderId": "1111499608327360513",
// "clientOid": "d0d4dad5-18d0-4869-a074-ec40bb47cba6",
// "price": "25000.0000000000000000",
// "size": "0.0002000000000000",
// "orderType": "limit",
// "side": "buy",
// "status": "cancelled",
// "priceAvg": "0",
// "baseVolume": "0.0000000000000000",
// "quoteVolume": "0.0000000000000000",
// "enterPointSource": "WEB",
// "feeDetail": "",
// "orderSource": "normal",
// "cTime": "1700728077966",
// "uTime": "1700728911471"
// }
//
// swap stop: fetchCanceledAndClosedOrders
//
// {
// "planType": "normal_plan",
// "symbol": "BTCUSDT",
// "size": "0.001",
// "orderId": "1111491399869075457",
// "clientOid": "1111491399869075456",
// "planStatus": "cancelled",
// "price": "27000",
// "feeDetail": null,
// "baseVolume": "0",
// "callbackRatio": "",
// "triggerPrice": "24000",
// "triggerType": "mark_price",
// "side": "buy",
// "posSide": "long",
// "marginCoin": "USDT",
// "marginMode": "crossed",
// "enterPointSource": "API",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderType": "limit",
// "stopSurplusTriggerPrice": "",
// "stopSurplusExecutePrice": "",
// "stopSurplusTriggerType": "fill_price",
// "stopLossTriggerPrice": "",
// "stopLossExecutePrice": "",
// "stopLossTriggerType": "fill_price",
// "cTime": "1700726120917",
// "uTime": "1700727879652"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var errorMessage interface{} = this.SafeString(order, "errorMsg")
if IsTrue(!IsEqual(errorMessage, nil)) {
return this.SafeOrder(map[string]interface{} {
"info": order,
"id": this.SafeString(order, "orderId"),
"clientOrderId": this.SafeString2(order, "clientOrderId", "clientOid"),
"status": "rejected",
}, market)
}
var isContractOrder interface{} = (InOp(order, "posSide"))
var marketType interface{} = Ternary(IsTrue(isContractOrder), "contract", "spot")
if IsTrue(!IsEqual(market, nil)) {
marketType = GetValue(market, "type")
}
var marketId interface{} = this.SafeString(order, "symbol")
market = this.SafeMarket(marketId, market, nil, marketType)
var timestamp interface{} = this.SafeInteger2(order, "cTime", "ctime")
var updateTimestamp interface{} = this.SafeInteger(order, "uTime")
var rawStatus interface{} = this.SafeString2(order, "status", "state")
var fee interface{} = nil
var feeCostString interface{} = this.SafeString(order, "fee")
if IsTrue(!IsEqual(feeCostString, nil)) {
// swap
fee = map[string]interface{} {
"cost": this.ParseNumber(Precise.StringNeg(feeCostString)),
"currency": GetValue(market, "settle"),
}
}
var feeDetail interface{} = this.SafeValue(order, "feeDetail")
if IsTrue(!IsEqual(feeDetail, nil)) {
var parsedFeeDetail interface{} = JsonParse(feeDetail)
var feeValues interface{} = ObjectValues(parsedFeeDetail)
var feeObject interface{} = nil
for i := 0; IsLessThan(i, GetArrayLength(feeValues)); i++ {
var feeValue interface{} = GetValue(feeValues, i)
if IsTrue(!IsEqual(this.SafeValue(feeValue, "feeCoinCode"), nil)) {
feeObject = feeValue
break
}
}
fee = map[string]interface{} {
"cost": this.ParseNumber(Precise.StringNeg(this.SafeString(feeObject, "totalFee"))),
"currency": this.SafeCurrencyCode(this.SafeString(feeObject, "feeCoinCode")),
}
}
var postOnly interface{} = nil
var timeInForce interface{} = this.SafeStringUpper(order, "force")
if IsTrue(IsEqual(timeInForce, "POST_ONLY")) {
postOnly = true
timeInForce = "PO"
}
var reduceOnly interface{} = nil
var reduceOnlyRaw interface{} = this.SafeString(order, "reduceOnly")
if IsTrue(!IsEqual(reduceOnlyRaw, nil)) {
reduceOnly = Ternary(IsTrue((IsEqual(reduceOnlyRaw, "NO"))), false, true)
}
var price interface{} = nil
var average interface{} = nil
var basePrice interface{} = this.SafeString(order, "basePrice")
if IsTrue(!IsEqual(basePrice, nil)) {
// for spot fetchOpenOrders, the price is priceAvg and the filled price is basePrice
price = this.SafeString(order, "priceAvg")
average = this.SafeString(order, "basePrice")
} else {
price = this.SafeString2(order, "price", "executePrice")
average = this.SafeString(order, "priceAvg")
}
var size interface{} = nil
var filled interface{} = nil
var baseSize interface{} = this.SafeString(order, "baseSize")
if IsTrue(!IsEqual(baseSize, nil)) {
// for spot margin fetchOpenOrders, the order size is baseSize and the filled amount is size
size = baseSize
filled = this.SafeString(order, "size")
} else {
size = this.SafeString(order, "size")
filled = this.SafeString(order, "baseVolume")
}
var side interface{} = this.SafeString(order, "side")
var posMode interface{} = this.SafeString(order, "posMode")
if IsTrue(IsTrue(IsEqual(posMode, "hedge_mode")) && IsTrue(reduceOnly)) {
side = Ternary(IsTrue((IsEqual(side, "buy"))), "sell", "buy")
}
return this.SafeOrder(map[string]interface{} {
"info": order,
"id": this.SafeString2(order, "orderId", "data"),
"clientOrderId": this.SafeString2(order, "clientOrderId", "clientOid"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"lastTradeTimestamp": updateTimestamp,
"lastUpdateTimestamp": updateTimestamp,
"symbol": GetValue(market, "symbol"),
"type": this.SafeString(order, "orderType"),
"side": side,
"price": price,
"amount": size,
"cost": this.SafeString2(order, "quoteVolume", "quoteSize"),
"average": average,
"filled": filled,
"remaining": nil,
"timeInForce": timeInForce,
"postOnly": postOnly,
"reduceOnly": reduceOnly,
"triggerPrice": this.SafeNumber(order, "triggerPrice"),
"takeProfitPrice": this.SafeNumber2(order, "presetStopSurplusPrice", "stopSurplusTriggerPrice"),
"stopLossPrice": this.SafeNumber2(order, "presetStopLossPrice", "stopLossTriggerPrice"),
"status": this.ParseOrderStatus(rawStatus),
"fee": fee,
"trades": nil,
}, market)
}
/**
* @method
* @name bitget#createMarketBuyOrderWithCost
* @description create a market buy order by providing the symbol and cost
* @see https://www.bitget.com/api-doc/spot/trade/Place-Order
* @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Place-Order
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Place-Order
* @param {string} symbol unified symbol of the market to create an order in
* @param {float} cost how much you want to trade in units of the quote currency
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) CreateMarketBuyOrderWithCost(symbol interface{}, cost interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes43168 := (<-this.LoadMarkets())
PanicOnError(retRes43168)
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "spot")) {
panic(NotSupported(Add(this.Id, " createMarketBuyOrderWithCost() supports spot orders only")))
}
var req interface{} = map[string]interface{} {
"createMarketBuyOrderRequiresPrice": false,
}
retRes432415 := (<-this.CreateOrder(symbol, "market", "buy", cost, nil, this.Extend(req, params)))
PanicOnError(retRes432415)
ch <- retRes432415
return nil
}()
return ch
}
/**
* @method
* @name bitget#createOrder
* @description create a trade order
* @see https://www.bitget.com/api-doc/spot/trade/Place-Order
* @see https://www.bitget.com/api-doc/spot/plan/Place-Plan-Order
* @see https://www.bitget.com/api-doc/contract/trade/Place-Order
* @see https://www.bitget.com/api-doc/contract/plan/Place-Tpsl-Order
* @see https://www.bitget.com/api-doc/contract/plan/Place-Plan-Order
* @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Place-Order
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Place-Order
* @param {string} symbol unified symbol of the market to create an order in
* @param {string} type 'market' or 'limit'
* @param {string} side 'buy' or 'sell'
* @param {float} amount how much you want to trade in units of the base currency
* @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {float} [params.cost] *spot only* how much you want to trade in units of the quote currency, for market buy orders only
* @param {float} [params.triggerPrice] *swap only* The price at which a trigger order is triggered at
* @param {float} [params.stopLossPrice] *swap only* The price at which a stop loss order is triggered at
* @param {float} [params.takeProfitPrice] *swap only* The price at which a take profit order is triggered at
* @param {object} [params.takeProfit] *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered (perpetual swap markets only)
* @param {float} [params.takeProfit.triggerPrice] *swap only* take profit trigger price
* @param {object} [params.stopLoss] *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered (perpetual swap markets only)
* @param {float} [params.stopLoss.triggerPrice] *swap only* stop loss trigger price
* @param {string} [params.timeInForce] "GTC", "IOC", "FOK", or "PO"
* @param {string} [params.marginMode] 'isolated' or 'cross' for spot margin trading
* @param {string} [params.loanType] *spot margin only* 'normal', 'autoLoan', 'autoRepay', or 'autoLoanAndRepay' default is 'normal'
* @param {string} [params.holdSide] *contract stopLossPrice, takeProfitPrice only* Two-way position: ('long' or 'short'), one-way position: ('buy' or 'sell')
* @param {float} [params.stopLoss.price] *swap only* the execution price for a stop loss attached to a trigger order
* @param {float} [params.takeProfit.price] *swap only* the execution price for a take profit attached to a trigger order
* @param {string} [params.stopLoss.type] *swap only* the type for a stop loss attached to a trigger order, 'fill_price', 'index_price' or 'mark_price', default is 'mark_price'
* @param {string} [params.takeProfit.type] *swap only* the type for a take profit attached to a trigger order, 'fill_price', 'index_price' or 'mark_price', default is 'mark_price'
* @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
* @param {string} [params.trailingTriggerPrice] *swap and future only* the price to trigger a trailing stop order, default uses the price argument
* @param {string} [params.triggerType] *swap and future only* 'fill_price', 'mark_price' or 'index_price'
* @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
* @param {bool} [params.hedged] *swap and future only* true for hedged mode, false for one way mode, default is false
* @param {bool} [params.reduceOnly] true or false whether the order is reduce-only
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) CreateOrder(symbol interface{}, typeVar interface{}, side interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
price := GetArg(optionalArgs, 0, nil)
_ = price
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes43698 := (<-this.LoadMarkets())
PanicOnError(retRes43698)
var market interface{} = this.Market(symbol)
var marginParams interface{} = this.HandleMarginModeAndParams("createOrder", params)
var marginMode interface{} = GetValue(marginParams, 0)
var triggerPrice interface{} = this.SafeValue2(params, "stopPrice", "triggerPrice")
var stopLossTriggerPrice interface{} = this.SafeValue(params, "stopLossPrice")
var takeProfitTriggerPrice interface{} = this.SafeValue(params, "takeProfitPrice")
var trailingPercent interface{} = this.SafeString2(params, "trailingPercent", "callbackRatio")
var isTrailingPercentOrder interface{} = !IsEqual(trailingPercent, nil)
var isTriggerOrder interface{} = !IsEqual(triggerPrice, nil)
var isStopLossTriggerOrder interface{} = !IsEqual(stopLossTriggerPrice, nil)
var isTakeProfitTriggerOrder interface{} = !IsEqual(takeProfitTriggerPrice, nil)
var isStopLossOrTakeProfitTrigger interface{} = IsTrue(isStopLossTriggerOrder) || IsTrue(isTakeProfitTriggerOrder)
var request interface{} = this.CreateOrderRequest(symbol, typeVar, side, amount, price, params)
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
if IsTrue(isTriggerOrder) {
response = (<-this.PrivateSpotPostV2SpotTradePlacePlanOrder(request))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "isolated")) {
response = (<-this.PrivateMarginPostV2MarginIsolatedPlaceOrder(request))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginPostV2MarginCrossedPlaceOrder(request))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotPostV2SpotTradePlaceOrder(request))
PanicOnError(response)
}
} else {
if IsTrue(IsTrue(isTriggerOrder) || IsTrue(isTrailingPercentOrder)) {
response = (<-this.PrivateMixPostV2MixOrderPlacePlanOrder(request))
PanicOnError(response)
} else if IsTrue(isStopLossOrTakeProfitTrigger) {
response = (<-this.PrivateMixPostV2MixOrderPlaceTpslOrder(request))
PanicOnError(response)
} else {
response = (<-this.PrivateMixPostV2MixOrderPlaceOrder(request))
PanicOnError(response)
}
}
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1645932209602,
// "data": {
// "orderId": "881669078313766912",
// "clientOid": "iauIBf#a45b595f96474d888d0ada"
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
ch <- this.ParseOrder(data, market)
return nil
}()
return ch
}
func (this *bitget) CreateOrderRequest(symbol interface{}, typeVar interface{}, side interface{}, amount interface{}, optionalArgs ...interface{}) interface{} {
price := GetArg(optionalArgs, 0, nil)
_ = price
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var marketType interface{} = nil
var marginMode interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("createOrder", market, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
marginModeparamsVariable := this.HandleMarginModeAndParams("createOrder", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"orderType": typeVar,
}
var isMarketOrder interface{} = IsEqual(typeVar, "market")
var triggerPrice interface{} = this.SafeValue2(params, "stopPrice", "triggerPrice")
var stopLossTriggerPrice interface{} = this.SafeValue(params, "stopLossPrice")
var takeProfitTriggerPrice interface{} = this.SafeValue(params, "takeProfitPrice")
var stopLoss interface{} = this.SafeValue(params, "stopLoss")
var takeProfit interface{} = this.SafeValue(params, "takeProfit")
var isTriggerOrder interface{} = !IsEqual(triggerPrice, nil)
var isStopLossTriggerOrder interface{} = !IsEqual(stopLossTriggerPrice, nil)
var isTakeProfitTriggerOrder interface{} = !IsEqual(takeProfitTriggerPrice, nil)
var isStopLoss interface{} = !IsEqual(stopLoss, nil)
var isTakeProfit interface{} = !IsEqual(takeProfit, nil)
var isStopLossOrTakeProfitTrigger interface{} = IsTrue(isStopLossTriggerOrder) || IsTrue(isTakeProfitTriggerOrder)
var isStopLossOrTakeProfit interface{} = IsTrue(isStopLoss) || IsTrue(isTakeProfit)
var trailingTriggerPrice interface{} = this.SafeString(params, "trailingTriggerPrice", this.NumberToString(price))
var trailingPercent interface{} = this.SafeString2(params, "trailingPercent", "callbackRatio")
var isTrailingPercentOrder interface{} = !IsEqual(trailingPercent, nil)
if IsTrue(IsGreaterThan(this.Sum(isTriggerOrder, isStopLossTriggerOrder, isTakeProfitTriggerOrder, isTrailingPercentOrder), 1)) {
panic(ExchangeError(Add(this.Id, " createOrder() params can only contain one of triggerPrice, stopLossPrice, takeProfitPrice, trailingPercent")))
}
if IsTrue(IsEqual(typeVar, "limit")) {
AddElementToObject(request, "price", this.PriceToPrecision(symbol, price))
}
var triggerPriceType interface{} = this.SafeString2(params, "triggerPriceType", "triggerType", "mark_price")
var reduceOnly interface{} = this.SafeBool(params, "reduceOnly", false)
var clientOrderId interface{} = this.SafeString2(params, "clientOid", "clientOrderId")
var exchangeSpecificTifParam interface{} = this.SafeString2(params, "force", "timeInForce")
var postOnly interface{} = nil
postOnlyparamsVariable := this.HandlePostOnly(isMarketOrder, IsEqual(exchangeSpecificTifParam, "post_only"), params);
postOnly = GetValue(postOnlyparamsVariable,0);
params = GetValue(postOnlyparamsVariable,1)
var defaultTimeInForce interface{} = this.SafeStringUpper(this.Options, "defaultTimeInForce")
var timeInForce interface{} = this.SafeStringUpper(params, "timeInForce", defaultTimeInForce)
if IsTrue(postOnly) {
AddElementToObject(request, "force", "post_only")
} else if IsTrue(IsEqual(timeInForce, "GTC")) {
AddElementToObject(request, "force", "GTC")
} else if IsTrue(IsEqual(timeInForce, "FOK")) {
AddElementToObject(request, "force", "FOK")
} else if IsTrue(IsEqual(timeInForce, "IOC")) {
AddElementToObject(request, "force", "IOC")
}
params = this.Omit(params, []interface{}{"stopPrice", "triggerType", "stopLossPrice", "takeProfitPrice", "stopLoss", "takeProfit", "postOnly", "reduceOnly", "clientOrderId", "trailingPercent", "trailingTriggerPrice"})
if IsTrue(IsTrue((IsEqual(marketType, "swap"))) || IsTrue((IsEqual(marketType, "future")))) {
AddElementToObject(request, "marginCoin", GetValue(market, "settleId"))
AddElementToObject(request, "size", this.AmountToPrecision(symbol, amount))
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
if IsTrue(!IsEqual(clientOrderId, nil)) {
AddElementToObject(request, "clientOid", clientOrderId)
}
if IsTrue(IsTrue(IsTrue(isTriggerOrder) || IsTrue(isStopLossOrTakeProfitTrigger)) || IsTrue(isTrailingPercentOrder)) {
AddElementToObject(request, "triggerType", triggerPriceType)
}
if IsTrue(isTrailingPercentOrder) {
if !IsTrue(isMarketOrder) {
panic(BadRequest(Add(this.Id, " createOrder() bitget trailing orders must be market orders")))
}
if IsTrue(IsEqual(trailingTriggerPrice, nil)) {
panic(ArgumentsRequired(Add(this.Id, " createOrder() bitget trailing orders must have a trailingTriggerPrice param")))
}
AddElementToObject(request, "planType", "track_plan")
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, trailingTriggerPrice))
AddElementToObject(request, "callbackRatio", trailingPercent)
} else if IsTrue(isTriggerOrder) {
AddElementToObject(request, "planType", "normal_plan")
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, triggerPrice))
if IsTrue(!IsEqual(price, nil)) {
AddElementToObject(request, "executePrice", this.PriceToPrecision(symbol, price))
}
if IsTrue(isStopLoss) {
var slTriggerPrice interface{} = this.SafeNumber2(stopLoss, "triggerPrice", "stopPrice")
AddElementToObject(request, "stopLossTriggerPrice", this.PriceToPrecision(symbol, slTriggerPrice))
var slPrice interface{} = this.SafeNumber(stopLoss, "price")
AddElementToObject(request, "stopLossExecutePrice", this.PriceToPrecision(symbol, slPrice))
var slType interface{} = this.SafeString(stopLoss, "type", "mark_price")
AddElementToObject(request, "stopLossTriggerType", slType)
}
if IsTrue(isTakeProfit) {
var tpTriggerPrice interface{} = this.SafeNumber2(takeProfit, "triggerPrice", "stopPrice")
AddElementToObject(request, "stopSurplusTriggerPrice", this.PriceToPrecision(symbol, tpTriggerPrice))
var tpPrice interface{} = this.SafeNumber(takeProfit, "price")
AddElementToObject(request, "stopSurplusExecutePrice", this.PriceToPrecision(symbol, tpPrice))
var tpType interface{} = this.SafeString(takeProfit, "type", "mark_price")
AddElementToObject(request, "stopSurplusTriggerType", tpType)
}
} else if IsTrue(isStopLossOrTakeProfitTrigger) {
if !IsTrue(isMarketOrder) {
panic(ExchangeError(Add(this.Id, " createOrder() bitget stopLoss or takeProfit orders must be market orders")))
}
AddElementToObject(request, "holdSide", Ternary(IsTrue((IsEqual(side, "buy"))), "long", "short"))
if IsTrue(isStopLossTriggerOrder) {
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, stopLossTriggerPrice))
AddElementToObject(request, "planType", "pos_loss")
} else if IsTrue(isTakeProfitTriggerOrder) {
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, takeProfitTriggerPrice))
AddElementToObject(request, "planType", "pos_profit")
}
} else {
if IsTrue(isStopLoss) {
var slTriggerPrice interface{} = this.SafeValue2(stopLoss, "triggerPrice", "stopPrice")
AddElementToObject(request, "presetStopLossPrice", this.PriceToPrecision(symbol, slTriggerPrice))
}
if IsTrue(isTakeProfit) {
var tpTriggerPrice interface{} = this.SafeValue2(takeProfit, "triggerPrice", "stopPrice")
AddElementToObject(request, "presetStopSurplusPrice", this.PriceToPrecision(symbol, tpTriggerPrice))
}
}
if !IsTrue(isStopLossOrTakeProfitTrigger) {
if IsTrue(IsEqual(marginMode, nil)) {
marginMode = "cross"
}
var marginModeRequest interface{} = Ternary(IsTrue((IsEqual(marginMode, "cross"))), "crossed", "isolated")
AddElementToObject(request, "marginMode", marginModeRequest)
var hedged interface{} = nil
hedgedparamsVariable := this.HandleParamBool(params, "hedged", false);
hedged = GetValue(hedgedparamsVariable,0);
params = GetValue(hedgedparamsVariable,1)
// backward compatibility for `oneWayMode`
var oneWayMode interface{} = nil
oneWayModeparamsVariable := this.HandleParamBool(params, "oneWayMode");
oneWayMode = GetValue(oneWayModeparamsVariable,0);
params = GetValue(oneWayModeparamsVariable,1)
if IsTrue(!IsEqual(oneWayMode, nil)) {
hedged = !IsTrue(oneWayMode)
}
var requestSide interface{} = side
if IsTrue(reduceOnly) {
if !IsTrue(hedged) {
AddElementToObject(request, "reduceOnly", "YES")
} else {
// on bitget hedge mode if the position is long the side is always buy, and if the position is short the side is always sell
requestSide = Ternary(IsTrue((IsEqual(side, "buy"))), "sell", "buy")
AddElementToObject(request, "tradeSide", "Close")
}
} else {
if IsTrue(hedged) {
AddElementToObject(request, "tradeSide", "Open")
}
}
AddElementToObject(request, "side", requestSide)
}
} else if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(IsTrue(isStopLossOrTakeProfitTrigger) || IsTrue(isStopLossOrTakeProfit)) {
panic(InvalidOrder(Add(this.Id, " createOrder() does not support stop loss/take profit orders on spot markets, only swap markets")))
}
AddElementToObject(request, "side", side)
var quantity interface{} = nil
var planType interface{} = nil
var createMarketBuyOrderRequiresPrice interface{} = true
createMarketBuyOrderRequiresPriceparamsVariable := this.HandleOptionAndParams(params, "createOrder", "createMarketBuyOrderRequiresPrice", true);
createMarketBuyOrderRequiresPrice = GetValue(createMarketBuyOrderRequiresPriceparamsVariable,0);
params = GetValue(createMarketBuyOrderRequiresPriceparamsVariable,1)
if IsTrue(IsTrue(isMarketOrder) && IsTrue((IsEqual(side, "buy")))) {
planType = "total"
var cost interface{} = this.SafeNumber(params, "cost")
params = this.Omit(params, "cost")
if IsTrue(!IsEqual(cost, nil)) {
quantity = this.CostToPrecision(symbol, cost)
} else if IsTrue(createMarketBuyOrderRequiresPrice) {
if IsTrue(IsEqual(price, nil)) {
panic(InvalidOrder(Add(this.Id, " createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument")))
} else {
var amountString interface{} = this.NumberToString(amount)
var priceString interface{} = this.NumberToString(price)
var quoteAmount interface{} = Precise.StringMul(amountString, priceString)
quantity = this.CostToPrecision(symbol, quoteAmount)
}
} else {
quantity = this.CostToPrecision(symbol, amount)
}
} else {
planType = "amount"
quantity = this.AmountToPrecision(symbol, amount)
}
if IsTrue(!IsEqual(clientOrderId, nil)) {
AddElementToObject(request, "clientOid", clientOrderId)
}
if IsTrue(!IsEqual(marginMode, nil)) {
AddElementToObject(request, "loanType", "normal")
if IsTrue(IsTrue(isMarketOrder) && IsTrue((IsEqual(side, "buy")))) {
AddElementToObject(request, "quoteSize", quantity)
} else {
AddElementToObject(request, "baseSize", quantity)
}
} else {
if IsTrue(!IsEqual(quantity, nil)) {
AddElementToObject(request, "size", quantity)
}
if IsTrue(!IsEqual(triggerPrice, nil)) {
AddElementToObject(request, "planType", planType)
AddElementToObject(request, "triggerType", triggerPriceType)
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, triggerPrice))
if IsTrue(!IsEqual(price, nil)) {
AddElementToObject(request, "executePrice", this.PriceToPrecision(symbol, price))
}
}
}
} else {
panic(NotSupported(Add(Add(Add(this.Id, " createOrder() does not support "), marketType), " orders")))
}
return this.Extend(request, params)
}
/**
* @method
* @name bitget#createOrders
* @description create a list of trade orders (all orders should be of the same symbol)
* @see https://www.bitget.com/api-doc/spot/trade/Batch-Place-Orders
* @see https://www.bitget.com/api-doc/contract/trade/Batch-Order
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Batch-Order
* @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Batch-Order
* @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
* @param {object} [params] extra parameters specific to the api endpoint
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) CreateOrders(orders interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes46448 := (<-this.LoadMarkets())
PanicOnError(retRes46448)
var ordersRequests interface{} = []interface{}{}
var symbol interface{} = nil
var marginMode interface{} = nil
for i := 0; IsLessThan(i, GetArrayLength(orders)); i++ {
var rawOrder interface{} = GetValue(orders, i)
var marketId interface{} = this.SafeString(rawOrder, "symbol")
if IsTrue(IsEqual(symbol, nil)) {
symbol = marketId
} else {
if IsTrue(!IsEqual(symbol, marketId)) {
panic(BadRequest(Add(this.Id, " createOrders() requires all orders to have the same symbol")))
}
}
var typeVar interface{} = this.SafeString(rawOrder, "type")
var side interface{} = this.SafeString(rawOrder, "side")
var amount interface{} = this.SafeValue(rawOrder, "amount")
var price interface{} = this.SafeValue(rawOrder, "price")
var orderParams interface{} = this.SafeValue(rawOrder, "params", map[string]interface{} {})
var marginResult interface{} = this.HandleMarginModeAndParams("createOrders", orderParams)
var currentMarginMode interface{} = GetValue(marginResult, 0)
if IsTrue(!IsEqual(currentMarginMode, nil)) {
if IsTrue(IsEqual(marginMode, nil)) {
marginMode = currentMarginMode
} else {
if IsTrue(!IsEqual(marginMode, currentMarginMode)) {
panic(BadRequest(Add(this.Id, " createOrders() requires all orders to have the same margin mode (isolated or cross)")))
}
}
}
var orderRequest interface{} = this.CreateOrderRequest(marketId, typeVar, side, amount, price, orderParams)
AppendToArray(&ordersRequests,orderRequest)
}
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"orderList": ordersRequests,
}
var response interface{} = nil
if IsTrue(IsTrue((GetValue(market, "swap"))) || IsTrue((GetValue(market, "future")))) {
if IsTrue(IsEqual(marginMode, nil)) {
marginMode = "cross"
}
var marginModeRequest interface{} = Ternary(IsTrue((IsEqual(marginMode, "cross"))), "crossed", "isolated")
AddElementToObject(request, "marginMode", marginModeRequest)
AddElementToObject(request, "marginCoin", GetValue(market, "settleId"))
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response = (<-this.PrivateMixPostV2MixOrderBatchPlaceOrder(request))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "isolated")) {
response = (<-this.PrivateMarginPostV2MarginIsolatedBatchPlaceOrder(request))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginPostV2MarginCrossedBatchPlaceOrder(request))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotPostV2SpotTradeBatchOrders(request))
PanicOnError(response)
}
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700703539416,
// "data": {
// "successList": [
// {
// "orderId": "1111397214281175046",
// "clientOid": "766d3fc3-7321-4406-a689-15c9987a2e75"
// },
// ],
// "failureList": [
// {
// "orderId": "",
// "clientOid": "d1b75cb3-cc15-4ede-ad4c-3937396f75ab",
// "errorMsg": "less than the minimum amount 5 USDT",
// "errorCode": "45110"
// },
// ]
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var failure interface{} = this.SafeValue(data, "failureList", []interface{}{})
var orderInfo interface{} = this.SafeValue(data, "successList", []interface{}{})
var both interface{} = this.ArrayConcat(orderInfo, failure)
ch <- this.ParseOrders(both, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#editOrder
* @description edit a trade order
* @see https://www.bitget.com/api-doc/spot/plan/Modify-Plan-Order
* @see https://www.bitget.com/api-doc/contract/trade/Modify-Order
* @see https://www.bitget.com/api-doc/contract/plan/Modify-Tpsl-Order
* @see https://www.bitget.com/api-doc/contract/plan/Modify-Plan-Order
* @param {string} id cancel order id
* @param {string} symbol unified symbol of the market to create an order in
* @param {string} type 'market' or 'limit'
* @param {string} side 'buy' or 'sell'
* @param {float} amount how much you want to trade in units of the base currency
* @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {float} [params.triggerPrice] the price that a trigger order is triggered at
* @param {float} [params.stopLossPrice] *swap only* The price at which a stop loss order is triggered at
* @param {float} [params.takeProfitPrice] *swap only* The price at which a take profit order is triggered at
* @param {object} [params.takeProfit] *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered (perpetual swap markets only)
* @param {float} [params.takeProfit.triggerPrice] *swap only* take profit trigger price
* @param {object} [params.stopLoss] *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered (perpetual swap markets only)
* @param {float} [params.stopLoss.triggerPrice] *swap only* stop loss trigger price
* @param {float} [params.stopLoss.price] *swap only* the execution price for a stop loss attached to a trigger order
* @param {float} [params.takeProfit.price] *swap only* the execution price for a take profit attached to a trigger order
* @param {string} [params.stopLoss.type] *swap only* the type for a stop loss attached to a trigger order, 'fill_price', 'index_price' or 'mark_price', default is 'mark_price'
* @param {string} [params.takeProfit.type] *swap only* the type for a take profit attached to a trigger order, 'fill_price', 'index_price' or 'mark_price', default is 'mark_price'
* @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
* @param {string} [params.trailingTriggerPrice] *swap and future only* the price to trigger a trailing stop order, default uses the price argument
* @param {string} [params.newTriggerType] *swap and future only* 'fill_price', 'mark_price' or 'index_price'
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) EditOrder(id interface{}, symbol interface{}, typeVar interface{}, side interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
amount := GetArg(optionalArgs, 0, nil)
_ = amount
price := GetArg(optionalArgs, 1, nil)
_ = price
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
retRes47708 := (<-this.LoadMarkets())
PanicOnError(retRes47708)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {
"orderId": id,
}
var isMarketOrder interface{} = IsEqual(typeVar, "market")
var triggerPrice interface{} = this.SafeValue2(params, "stopPrice", "triggerPrice")
var isTriggerOrder interface{} = !IsEqual(triggerPrice, nil)
var stopLossPrice interface{} = this.SafeValue(params, "stopLossPrice")
var isStopLossOrder interface{} = !IsEqual(stopLossPrice, nil)
var takeProfitPrice interface{} = this.SafeValue(params, "takeProfitPrice")
var isTakeProfitOrder interface{} = !IsEqual(takeProfitPrice, nil)
var stopLoss interface{} = this.SafeValue(params, "stopLoss")
var takeProfit interface{} = this.SafeValue(params, "takeProfit")
var isStopLoss interface{} = !IsEqual(stopLoss, nil)
var isTakeProfit interface{} = !IsEqual(takeProfit, nil)
var trailingTriggerPrice interface{} = this.SafeString(params, "trailingTriggerPrice", this.NumberToString(price))
var trailingPercent interface{} = this.SafeString2(params, "trailingPercent", "newCallbackRatio")
var isTrailingPercentOrder interface{} = !IsEqual(trailingPercent, nil)
if IsTrue(IsGreaterThan(this.Sum(isTriggerOrder, isStopLossOrder, isTakeProfitOrder, isTrailingPercentOrder), 1)) {
panic(ExchangeError(Add(this.Id, " editOrder() params can only contain one of triggerPrice, stopLossPrice, takeProfitPrice, trailingPercent")))
}
var clientOrderId interface{} = this.SafeString2(params, "clientOid", "clientOrderId")
if IsTrue(!IsEqual(clientOrderId, nil)) {
AddElementToObject(request, "clientOid", clientOrderId)
}
params = this.Omit(params, []interface{}{"stopPrice", "triggerType", "stopLossPrice", "takeProfitPrice", "stopLoss", "takeProfit", "clientOrderId", "trailingTriggerPrice", "trailingPercent"})
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
if IsTrue(IsEqual(triggerPrice, nil)) {
panic(NotSupported(Add(this.Id, " editOrder() only supports plan/trigger spot orders")))
}
var editMarketBuyOrderRequiresPrice interface{} = this.SafeBool(this.Options, "editMarketBuyOrderRequiresPrice", true)
if IsTrue(IsTrue(IsTrue(editMarketBuyOrderRequiresPrice) && IsTrue(isMarketOrder)) && IsTrue((IsEqual(side, "buy")))) {
if IsTrue(IsEqual(price, nil)) {
panic(InvalidOrder(Add(this.Id, " editOrder() requires price argument for market buy orders on spot markets to calculate the total amount to spend (amount * price), alternatively set the editMarketBuyOrderRequiresPrice option to false and pass in the cost to spend into the amount parameter")))
} else {
var amountString interface{} = this.NumberToString(amount)
var priceString interface{} = this.NumberToString(price)
var cost interface{} = this.ParseNumber(Precise.StringMul(amountString, priceString))
AddElementToObject(request, "size", this.PriceToPrecision(symbol, cost))
}
} else {
AddElementToObject(request, "size", this.AmountToPrecision(symbol, amount))
}
AddElementToObject(request, "orderType", typeVar)
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, triggerPrice))
AddElementToObject(request, "executePrice", this.PriceToPrecision(symbol, price))
response = (<-this.PrivateSpotPostV2SpotTradeModifyPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
if IsTrue(IsTrue((!IsTrue(GetValue(market, "swap")))) && IsTrue((!IsTrue(GetValue(market, "future"))))) {
panic(NotSupported(Add(Add(Add(this.Id, " editOrder() does not support "), GetValue(market, "type")), " orders")))
}
AddElementToObject(request, "symbol", GetValue(market, "id"))
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
if IsTrue(!IsTrue(isTakeProfitOrder) && !IsTrue(isStopLossOrder)) {
AddElementToObject(request, "newSize", this.AmountToPrecision(symbol, amount))
if IsTrue(IsTrue((!IsEqual(price, nil))) && !IsTrue(isTrailingPercentOrder)) {
AddElementToObject(request, "newPrice", this.PriceToPrecision(symbol, price))
}
}
if IsTrue(isTrailingPercentOrder) {
if !IsTrue(isMarketOrder) {
panic(BadRequest(Add(this.Id, " editOrder() bitget trailing orders must be market orders")))
}
if IsTrue(!IsEqual(trailingTriggerPrice, nil)) {
AddElementToObject(request, "newTriggerPrice", this.PriceToPrecision(symbol, trailingTriggerPrice))
}
AddElementToObject(request, "newCallbackRatio", trailingPercent)
response = (<-this.PrivateMixPostV2MixOrderModifyPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsTrue(isTakeProfitOrder) || IsTrue(isStopLossOrder)) {
AddElementToObject(request, "marginCoin", GetValue(market, "settleId"))
AddElementToObject(request, "size", this.AmountToPrecision(symbol, amount))
AddElementToObject(request, "executePrice", this.PriceToPrecision(symbol, price))
if IsTrue(isStopLossOrder) {
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, stopLossPrice))
} else if IsTrue(isTakeProfitOrder) {
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, takeProfitPrice))
}
response = (<-this.PrivateMixPostV2MixOrderModifyTpslOrder(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(isTriggerOrder) {
AddElementToObject(request, "newTriggerPrice", this.PriceToPrecision(symbol, triggerPrice))
if IsTrue(isStopLoss) {
var slTriggerPrice interface{} = this.SafeNumber2(stopLoss, "triggerPrice", "stopPrice")
AddElementToObject(request, "newStopLossTriggerPrice", this.PriceToPrecision(symbol, slTriggerPrice))
var slPrice interface{} = this.SafeNumber(stopLoss, "price")
AddElementToObject(request, "newStopLossExecutePrice", this.PriceToPrecision(symbol, slPrice))
var slType interface{} = this.SafeString(stopLoss, "type", "mark_price")
AddElementToObject(request, "newStopLossTriggerType", slType)
}
if IsTrue(isTakeProfit) {
var tpTriggerPrice interface{} = this.SafeNumber2(takeProfit, "triggerPrice", "stopPrice")
AddElementToObject(request, "newSurplusTriggerPrice", this.PriceToPrecision(symbol, tpTriggerPrice))
var tpPrice interface{} = this.SafeNumber(takeProfit, "price")
AddElementToObject(request, "newStopSurplusExecutePrice", this.PriceToPrecision(symbol, tpPrice))
var tpType interface{} = this.SafeString(takeProfit, "type", "mark_price")
AddElementToObject(request, "newStopSurplusTriggerType", tpType)
}
response = (<-this.PrivateMixPostV2MixOrderModifyPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
var defaultNewClientOrderId interface{} = this.Uuid()
var newClientOrderId interface{} = this.SafeString2(params, "newClientOid", "newClientOrderId", defaultNewClientOrderId)
params = this.Omit(params, "newClientOrderId")
AddElementToObject(request, "newClientOid", newClientOrderId)
if IsTrue(isStopLoss) {
var slTriggerPrice interface{} = this.SafeValue2(stopLoss, "triggerPrice", "stopPrice")
AddElementToObject(request, "newPresetStopLossPrice", this.PriceToPrecision(symbol, slTriggerPrice))
}
if IsTrue(isTakeProfit) {
var tpTriggerPrice interface{} = this.SafeValue2(takeProfit, "triggerPrice", "stopPrice")
AddElementToObject(request, "newPresetStopSurplusPrice", this.PriceToPrecision(symbol, tpTriggerPrice))
}
response = (<-this.PrivateMixPostV2MixOrderModifyOrder(this.Extend(request, params)))
PanicOnError(response)
}
}
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700708275737,
// "data": {
// "clientOid": "abe95dbe-6081-4a6f-a2d3-ae49601cd459",
// "orderId": null
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
ch <- this.ParseOrder(data, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#cancelOrder
* @description cancels an open order
* @see https://www.bitget.com/api-doc/spot/trade/Cancel-Order
* @see https://www.bitget.com/api-doc/spot/plan/Cancel-Plan-Order
* @see https://www.bitget.com/api-doc/contract/trade/Cancel-Order
* @see https://www.bitget.com/api-doc/contract/plan/Cancel-Plan-Order
* @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Cancel-Order
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Cancel-Order
* @param {string} id order id
* @param {string} symbol unified symbol of the market the order was made in
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.marginMode] 'isolated' or 'cross' for spot margin trading
* @param {boolean} [params.trigger] set to true for canceling trigger orders
* @param {string} [params.planType] *swap only* either profit_plan, loss_plan, normal_plan, pos_profit, pos_loss, moving_plan or track_plan
* @param {boolean} [params.trailing] set to true if you want to cancel a trailing order
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) CancelOrder(id interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " cancelOrder() requires a symbol argument")))
}
retRes49328 := (<-this.LoadMarkets())
PanicOnError(retRes49328)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var marginMode interface{} = nil
var response interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("cancelOrder", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
var request interface{} = map[string]interface{} {}
var trailing interface{} = this.SafeValue(params, "trailing")
var trigger interface{} = this.SafeValue2(params, "stop", "trigger")
params = this.Omit(params, []interface{}{"stop", "trigger", "trailing"})
if !IsTrue((IsTrue(GetValue(market, "spot")) && IsTrue(trigger))) {
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
if !IsTrue((IsTrue((IsTrue(GetValue(market, "swap")) || IsTrue(GetValue(market, "future")))) && IsTrue(trigger))) {
AddElementToObject(request, "orderId", id)
}
if IsTrue(IsTrue((GetValue(market, "swap"))) || IsTrue((GetValue(market, "future")))) {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
if IsTrue(IsTrue(trigger) || IsTrue(trailing)) {
var orderIdList interface{} = []interface{}{}
var orderId interface{} = map[string]interface{} {
"orderId": id,
}
AppendToArray(&orderIdList,orderId)
AddElementToObject(request, "orderIdList", orderIdList)
}
if IsTrue(trailing) {
var planType interface{} = this.SafeString(params, "planType", "track_plan")
AddElementToObject(request, "planType", planType)
response = (<-this.PrivateMixPostV2MixOrderCancelPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(trigger) {
response = (<-this.PrivateMixPostV2MixOrderCancelPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateMixPostV2MixOrderCancelOrder(this.Extend(request, params)))
PanicOnError(response)
}
} else if IsTrue(GetValue(market, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(IsEqual(marginMode, "isolated")) {
response = (<-this.PrivateMarginPostV2MarginIsolatedCancelOrder(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginPostV2MarginCrossedCancelOrder(this.Extend(request, params)))
PanicOnError(response)
}
} else {
if IsTrue(trigger) {
response = (<-this.PrivateSpotPostV2SpotTradeCancelPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotPostV2SpotTradeCancelOrder(this.Extend(request, params)))
PanicOnError(response)
}
}
} else {
panic(NotSupported(Add(Add(Add(this.Id, " cancelOrder() does not support "), GetValue(market, "type")), " orders")))
}
//
// spot, swap, future and spot margin
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1697690413177,
// "data": {
// "orderId": "1098758604547850241",
// "clientOid": "1098758604585598977"
// }
// }
//
// swap trigger
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700711311791,
// "data": {
// "successList": [
// {
// "clientOid": "1111428059067125760",
// "orderId": "1111428059067125761"
// }
// ],
// "failureList": []
// }
// }
//
// spot trigger
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700711728063,
// "data": {
// "result": "success"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var order interface{} = nil
if IsTrue(IsTrue((IsTrue(GetValue(market, "swap")) || IsTrue(GetValue(market, "future")))) && IsTrue(trigger)) {
var orderInfo interface{} = this.SafeValue(data, "successList", []interface{}{})
order = GetValue(orderInfo, 0)
} else {
order = data
}
ch <- this.ParseOrder(order, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#cancelOrders
* @description cancel multiple orders
* @see https://www.bitget.com/api-doc/spot/trade/Batch-Cancel-Orders
* @see https://www.bitget.com/api-doc/contract/trade/Batch-Cancel-Orders
* @see https://www.bitget.com/api-doc/contract/plan/Cancel-Plan-Order
* @see https://www.bitget.com/api-doc/margin/cross/trade/Cross-Batch-Cancel-Order
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Batch-Cancel-Orders
* @param {string[]} ids order ids
* @param {string} symbol unified market symbol, default is undefined
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.marginMode] 'isolated' or 'cross' for spot margin trading
* @param {boolean} [params.trigger] *contract only* set to true for canceling trigger orders
* @returns {object} an array of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) CancelOrders(ids interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " cancelOrders() requires a symbol argument")))
}
retRes50648 := (<-this.LoadMarkets())
PanicOnError(retRes50648)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("cancelOrders", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
var trigger interface{} = this.SafeValue2(params, "stop", "trigger")
params = this.Omit(params, []interface{}{"stop", "trigger"})
var orderIdList interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(ids)); i++ {
var individualId interface{} = GetValue(ids, i)
var orderId interface{} = map[string]interface{} {
"orderId": individualId,
}
AppendToArray(&orderIdList,orderId)
}
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
if IsTrue(IsTrue(GetValue(market, "spot")) && IsTrue((IsEqual(marginMode, nil)))) {
AddElementToObject(request, "orderList", orderIdList)
} else {
AddElementToObject(request, "orderIdList", orderIdList)
}
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginPostV2MarginCrossedBatchCancelOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateMarginPostV2MarginIsolatedBatchCancelOrder(this.Extend(request, params)))
PanicOnError(response)
}
} else {
response = (<-this.PrivateSpotPostV2SpotTradeBatchCancelOrder(this.Extend(request, params)))
PanicOnError(response)
}
} else {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
if IsTrue(trigger) {
response = (<-this.PrivateMixPostV2MixOrderCancelPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateMixPostV2MixOrderBatchCancelOrders(this.Extend(request, params)))
PanicOnError(response)
}
}
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": "1680008815965",
// "data": {
// "successList": [
// {
// "orderId": "1024598257429823488",
// "clientOid": "876493ce-c287-4bfc-9f4a-8b1905881313"
// },
// ],
// "failureList": []
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var orders interface{} = this.SafeList(data, "successList", []interface{}{})
ch <- this.ParseOrders(orders, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#cancelAllOrders
* @description cancel all open orders
* @see https://www.bitget.com/api-doc/spot/trade/Cancel-Symbol-Orders
* @see https://www.bitget.com/api-doc/spot/plan/Batch-Cancel-Plan-Order
* @see https://www.bitget.com/api-doc/contract/trade/Batch-Cancel-Orders
* @see https://bitgetlimited.github.io/apidoc/en/margin/#isolated-batch-cancel-orders
* @see https://bitgetlimited.github.io/apidoc/en/margin/#cross-batch-cancel-order
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.marginMode] 'isolated' or 'cross' for spot margin trading
* @param {boolean} [params.trigger] *contract only* set to true for canceling trigger orders
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) CancelAllOrders(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " cancelAllOrders() requires a symbol argument")))
}
retRes51548 := (<-this.LoadMarkets())
PanicOnError(retRes51548)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("cancelAllOrders", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
var trigger interface{} = this.SafeBool2(params, "stop", "trigger")
params = this.Omit(params, []interface{}{"stop", "trigger"})
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginPostMarginV1CrossOrderBatchCancelOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateMarginPostMarginV1IsolatedOrderBatchCancelOrder(this.Extend(request, params)))
PanicOnError(response)
}
} else {
if IsTrue(trigger) {
var stopRequest interface{} = map[string]interface{} {
"symbolList": []interface{}{GetValue(market, "id")},
}
response = (<-this.PrivateSpotPostV2SpotTradeBatchCancelPlanOrder(this.Extend(stopRequest, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotPostV2SpotTradeCancelSymbolOrder(this.Extend(request, params)))
PanicOnError(response)
}
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700716953996,
// "data": {
// "symbol": "BTCUSDT"
// }
// }
//
var timestamp interface{} = this.SafeInteger(response, "requestTime")
var responseData interface{} = this.SafeDict(response, "data")
var marketId interface{} = this.SafeString(responseData, "symbol")
ch <- []interface{}{this.SafeOrder(map[string]interface{} {
"info": response,
"symbol": this.SafeSymbol(marketId, nil, nil, "spot"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
})}
return nil
}
} else {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
if IsTrue(trigger) {
response = (<-this.PrivateMixPostV2MixOrderCancelPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateMixPostV2MixOrderBatchCancelOrders(this.Extend(request, params)))
PanicOnError(response)
}
}
var data interface{} = this.SafeDict(response, "data")
var resultList interface{} = this.SafeList2(data, "resultList", "successList")
var failureList interface{} = this.SafeList2(data, "failure", "failureList")
var responseList interface{} = this.ArrayConcat(resultList, failureList)
ch <- this.ParseOrders(responseList)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchOrder
* @description fetches information on an order made by the user
* @see https://www.bitget.com/api-doc/spot/trade/Get-Order-Info
* @see https://www.bitget.com/api-doc/contract/trade/Get-Order-Details
* @param {string} id the order id
* @param {string} symbol unified symbol of the market the order was made in
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) FetchOrder(id interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchOrder() requires a symbol argument")))
}
retRes52718 := (<-this.LoadMarkets())
PanicOnError(retRes52718)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {
"orderId": id,
}
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
response = (<-this.PrivateSpotGetV2SpotTradeOrderInfo(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsTrue(GetValue(market, "swap")) || IsTrue(GetValue(market, "future"))) {
AddElementToObject(request, "symbol", GetValue(market, "id"))
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response = (<-this.PrivateMixGetV2MixOrderDetail(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(NotSupported(Add(Add(Add(this.Id, " fetchOrder() does not support "), GetValue(market, "type")), " orders")))
}
//
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700719076263,
// "data": [
// {
// "userId": "7264631750",
// "symbol": "BTCUSDT",
// "orderId": "1111461743123927040",
// "clientOid": "63f95110-93b5-4309-8f77-46339f1bcf3c",
// "price": "25000.0000000000000000",
// "size": "0.0002000000000000",
// "orderType": "limit",
// "side": "buy",
// "status": "live",
// "priceAvg": "0",
// "baseVolume": "0.0000000000000000",
// "quoteVolume": "0.0000000000000000",
// "enterPointSource": "API",
// "feeDetail": "",
// "orderSource": "normal",
// "cTime": "1700719050198",
// "uTime": "1700719050198"
// }
// ]
// }
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700719918781,
// "data": {
// "symbol": "BTCUSDT",
// "size": "0.001",
// "orderId": "1111465253393825792",
// "clientOid": "1111465253431574529",
// "baseVolume": "0",
// "fee": "0",
// "price": "27000",
// "priceAvg": "",
// "state": "live",
// "side": "buy",
// "force": "gtc",
// "totalProfits": "0",
// "posSide": "long",
// "marginCoin": "USDT",
// "presetStopSurplusPrice": "",
// "presetStopLossPrice": "",
// "quoteVolume": "0",
// "orderType": "limit",
// "leverage": "20",
// "marginMode": "crossed",
// "reduceOnly": "NO",
// "enterPointSource": "API",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderSource": "normal",
// "cTime": "1700719887120",
// "uTime": "1700719887120"
// }
// }
//
if IsTrue(IsString(response)) {
response = JsonParse(response)
}
var data interface{} = this.SafeDict(response, "data")
if IsTrue((!IsEqual(data, nil))) {
if !IsTrue(IsArray(data)) {
ch <- this.ParseOrder(data, market)
return nil
}
}
var dataList interface{} = this.SafeList(response, "data", []interface{}{})
var first interface{} = this.SafeDict(dataList, 0, map[string]interface{} {})
ch <- this.ParseOrder(first, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchOpenOrders
* @description fetch all unfilled currently open orders
* @see https://www.bitget.com/api-doc/spot/trade/Get-Unfilled-Orders
* @see https://www.bitget.com/api-doc/spot/plan/Get-Current-Plan-Order
* @see https://www.bitget.com/api-doc/contract/trade/Get-Orders-Pending
* @see https://www.bitget.com/api-doc/contract/plan/get-orders-plan-pending
* @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Open-Orders
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Isolated-Open-Orders
* @param {string} symbol unified market symbol
* @param {int} [since] the earliest time in ms to fetch open orders for
* @param {int} [limit] the maximum number of open order structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch orders for
* @param {string} [params.planType] *contract stop only* 'normal_plan': average trigger order, 'profit_loss': opened tp/sl orders, 'track_plan': trailing stop order, default is 'normal_plan'
* @param {boolean} [params.trigger] set to true for fetching trigger orders
* @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)
* @param {string} [params.isPlan] *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
* @param {boolean} [params.trailing] set to true if you want to fetch trailing orders
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) FetchOpenOrders(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes54018 := (<-this.LoadMarkets())
PanicOnError(retRes54018)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
var typeVar interface{} = nil
var request interface{} = map[string]interface{} {}
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchOpenOrders", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
if IsTrue(!IsEqual(symbol, nil)) {
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
AddElementToObject(request, "symbol", GetValue(market, "id"))
var defaultType interface{} = this.SafeString2(this.Options, "fetchOpenOrders", "defaultType", "spot")
var marketType interface{} = Ternary(IsTrue((InOp(market, "type"))), GetValue(market, "type"), defaultType)
typeVar = this.SafeString(params, "type", marketType)
} else {
var defaultType interface{} = this.SafeString2(this.Options, "fetchOpenOrders", "defaultType", "spot")
typeVar = this.SafeString(params, "type", defaultType)
}
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchOpenOrders", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
var cursorReceived interface{} = nil
if IsTrue(IsEqual(typeVar, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
cursorReceived = "minId"
}
} else {
cursorReceived = "endId"
}
retRes543419 := (<-this.FetchPaginatedCallCursor("fetchOpenOrders", symbol, since, limit, params, cursorReceived, "idLessThan"))
PanicOnError(retRes543419)
ch <- retRes543419
return nil
}
var response interface{} = nil
var trailing interface{} = this.SafeBool(params, "trailing")
var trigger interface{} = this.SafeBool2(params, "stop", "trigger")
var planTypeDefined interface{} = !IsEqual(this.SafeString(params, "planType"), nil)
var isTrigger interface{} = (IsTrue(trigger) || IsTrue(planTypeDefined))
params = this.Omit(params, []interface{}{"stop", "trigger", "trailing"})
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(IsTrue(IsTrue((IsEqual(typeVar, "swap"))) || IsTrue((IsEqual(typeVar, "future")))) || IsTrue((!IsEqual(marginMode, nil)))) {
var clientOrderId interface{} = this.SafeString2(params, "clientOid", "clientOrderId")
params = this.Omit(params, "clientOrderId")
if IsTrue(!IsEqual(clientOrderId, nil)) {
AddElementToObject(request, "clientOid", clientOrderId)
}
}
var query interface{} = nil
query = this.Omit(params, []interface{}{"type"})
if IsTrue(IsEqual(typeVar, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(IsEqual(since, nil)) {
since = Subtract(this.Milliseconds(), 7776000000)
AddElementToObject(request, "startTime", since)
}
if IsTrue(IsEqual(marginMode, "isolated")) {
response = (<-this.PrivateMarginGetV2MarginIsolatedOpenOrders(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginGetV2MarginCrossedOpenOrders(this.Extend(request, query)))
PanicOnError(response)
}
} else {
if IsTrue(trigger) {
response = (<-this.PrivateSpotGetV2SpotTradeCurrentPlanOrder(this.Extend(request, query)))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotGetV2SpotTradeUnfilledOrders(this.Extend(request, query)))
PanicOnError(response)
}
}
} else {
var productType interface{} = nil
productTypequeryVariable := this.HandleProductTypeAndParams(market, query);
productType = GetValue(productTypequeryVariable,0);
query = GetValue(productTypequeryVariable,1)
AddElementToObject(request, "productType", productType)
if IsTrue(trailing) {
var planType interface{} = this.SafeString(params, "planType", "track_plan")
AddElementToObject(request, "planType", planType)
response = (<-this.PrivateMixGetV2MixOrderOrdersPlanPending(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(isTrigger) {
var planType interface{} = this.SafeString(query, "planType", "normal_plan")
AddElementToObject(request, "planType", planType)
response = (<-this.PrivateMixGetV2MixOrderOrdersPlanPending(this.Extend(request, query)))
PanicOnError(response)
} else {
response = (<-this.PrivateMixGetV2MixOrderOrdersPending(this.Extend(request, query)))
PanicOnError(response)
}
}
//
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700728123994,
// "data": [
// {
// "userId": "7264631750",
// "symbol": "BTCUSDT",
// "orderId": "1111499608327360513",
// "clientOid": "d0d4dad5-18d0-4869-a074-ec40bb47cba6",
// "priceAvg": "25000.0000000000000000",
// "size": "0.0002000000000000",
// "orderType": "limit",
// "side": "buy",
// "status": "live",
// "basePrice": "0",
// "baseVolume": "0.0000000000000000",
// "quoteVolume": "0.0000000000000000",
// "enterPointSource": "WEB",
// "orderSource": "normal",
// "cTime": "1700728077966",
// "uTime": "1700728077966"
// }
// ]
// }
//
// spot stop
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700729361609,
// "data": {
// "nextFlag": false,
// "idLessThan": "1111503385931620352",
// "orderList": [
// {
// "orderId": "1111503385931620352",
// "clientOid": "1111503385910648832",
// "symbol": "BTCUSDT",
// "size": "0.0002",
// "planType": "AMOUNT",
// "executePrice": "25000",
// "triggerPrice": "26000",
// "status": "live",
// "orderType": "limit",
// "side": "buy",
// "triggerType": "fill_price",
// "enterPointSource": "API",
// "cTime": "1700728978617",
// "uTime": "1700728978617"
// }
// ]
// }
// }
//
// spot margin
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700729887686,
// "data": {
// "orderList": [
// {
// "symbol": "BTCUSDT",
// "orderType": "limit",
// "enterPointSource": "WEB",
// "orderId": "1111506377509580801",
// "clientOid": "2043a3b59a60445f9d9f7365bf3e960c",
// "loanType": "autoLoanAndRepay",
// "price": "25000",
// "side": "buy",
// "status": "live",
// "baseSize": "0.0002",
// "quoteSize": "5",
// "priceAvg": "0",
// "size": "0",
// "amount": "0",
// "force": "gtc",
// "cTime": "1700729691866",
// "uTime": "1700729691866"
// }
// ],
// "maxId": "1111506377509580801",
// "minId": "1111506377509580801"
// }
// }
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700725609065,
// "data": {
// "entrustedList": [
// {
// "symbol": "BTCUSDT",
// "size": "0.002",
// "orderId": "1111488897767604224",
// "clientOid": "1111488897805352960",
// "baseVolume": "0",
// "fee": "0",
// "price": "25000",
// "priceAvg": "",
// "status": "live",
// "side": "buy",
// "force": "gtc",
// "totalProfits": "0",
// "posSide": "long",
// "marginCoin": "USDT",
// "quoteVolume": "0",
// "leverage": "20",
// "marginMode": "crossed",
// "enterPointSource": "web",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderType": "limit",
// "orderSource": "normal",
// "presetStopSurplusPrice": "",
// "presetStopLossPrice": "",
// "reduceOnly": "NO",
// "cTime": "1700725524378",
// "uTime": "1700725524378"
// }
// ],
// "endId": "1111488897767604224"
// }
// }
//
// swap and future stop
//
// {
// "code": "00000",\
// "msg": "success",
// "requestTime": 1700726417495,
// "data": {
// "entrustedList": [
// {
// "planType": "normal_plan",
// "symbol": "BTCUSDT",
// "size": "0.001",
// "orderId": "1111491399869075457",
// "clientOid": "1111491399869075456",
// "price": "27000",
// "callbackRatio": "",
// "triggerPrice": "24000",
// "triggerType": "mark_price",
// "planStatus": "live",
// "side": "buy",
// "posSide": "long",
// "marginCoin": "USDT",
// "marginMode": "crossed",
// "enterPointSource": "API",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderType": "limit",
// "stopSurplusTriggerPrice": "",
// "stopSurplusExecutePrice": "",
// "stopSurplusTriggerType": "fill_price",
// "stopLossTriggerPrice": "",
// "stopLossExecutePrice": "",
// "stopLossTriggerType": "fill_price",
// "cTime": "1700726120917",
// "uTime": "1700726120917"
// }
// ],
// "endId": "1111491399869075457"
// }
// }
//
var data interface{} = this.SafeValue(response, "data")
if IsTrue(IsEqual(typeVar, "spot")) {
if IsTrue(IsTrue((!IsEqual(marginMode, nil))) || IsTrue(trigger)) {
var resultList interface{} = this.SafeList(data, "orderList", []interface{}{})
ch <- this.ParseOrders(resultList, market, since, limit)
return nil
}
} else {
var result interface{} = this.SafeList(data, "entrustedList", []interface{}{})
ch <- this.ParseOrders(result, market, since, limit)
return nil
}
ch <- this.ParseOrders(data, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchClosedOrders
* @description fetches information on multiple closed orders made by the user
* @see https://www.bitget.com/api-doc/spot/trade/Get-History-Orders
* @see https://www.bitget.com/api-doc/spot/plan/Get-History-Plan-Order
* @see https://www.bitget.com/api-doc/contract/trade/Get-Orders-History
* @see https://www.bitget.com/api-doc/contract/plan/orders-plan-history
* @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-History
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Order-History
* @param {string} symbol unified market symbol of the closed orders
* @param {int} [since] timestamp in ms of the earliest order
* @param {int} [limit] the max number of closed orders to return
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch entries for
* @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)
* @param {string} [params.isPlan] *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
* @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @param {boolean} [params.trailing] set to true if you want to fetch trailing orders
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) FetchClosedOrders(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes57028 := (<-this.LoadMarkets())
PanicOnError(retRes57028)
orders:= (<-this.FetchCanceledAndClosedOrders(symbol, since, limit, params))
PanicOnError(orders)
ch <- this.FilterBy(orders, "status", "closed")
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchCanceledOrders
* @description fetches information on multiple canceled orders made by the user
* @see https://www.bitget.com/api-doc/spot/trade/Get-History-Orders
* @see https://www.bitget.com/api-doc/spot/plan/Get-History-Plan-Order
* @see https://www.bitget.com/api-doc/contract/trade/Get-Orders-History
* @see https://www.bitget.com/api-doc/contract/plan/orders-plan-history
* @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-History
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Order-History
* @param {string} symbol unified market symbol of the canceled orders
* @param {int} [since] timestamp in ms of the earliest order
* @param {int} [limit] the max number of canceled orders to return
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch entries for
* @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)
* @param {string} [params.isPlan] *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
* @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @param {boolean} [params.trailing] set to true if you want to fetch trailing orders
* @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) FetchCanceledOrders(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes57298 := (<-this.LoadMarkets())
PanicOnError(retRes57298)
orders:= (<-this.FetchCanceledAndClosedOrders(symbol, since, limit, params))
PanicOnError(orders)
ch <- this.FilterBy(orders, "status", "canceled")
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchCanceledAndClosedOrders
* @see https://www.bitget.com/api-doc/spot/trade/Get-History-Orders
* @see https://www.bitget.com/api-doc/spot/plan/Get-History-Plan-Order
* @see https://www.bitget.com/api-doc/contract/trade/Get-Orders-History
* @see https://www.bitget.com/api-doc/contract/plan/orders-plan-history
* @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-History
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Order-History
* @description fetches information on multiple canceled and closed orders made by the user
* @param {string} symbol unified market symbol of the market orders were made in
* @param {int} [since] the earliest time in ms to fetch orders for
* @param {int} [limit] the maximum number of order structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) FetchCanceledAndClosedOrders(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes57518 := (<-this.LoadMarkets())
PanicOnError(retRes57518)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
if IsTrue(!IsEqual(symbol, nil)) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
symbol = sandboxSymbol
}
}
var request interface{} = map[string]interface{} {}
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
var marketType interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchCanceledAndClosedOrders", market, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchCanceledAndClosedOrders", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchCanceledAndClosedOrders", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
var cursorReceived interface{} = nil
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
cursorReceived = "minId"
}
} else {
cursorReceived = "endId"
}
retRes578019 := (<-this.FetchPaginatedCallCursor("fetchCanceledAndClosedOrders", symbol, since, limit, params, cursorReceived, "idLessThan"))
PanicOnError(retRes578019)
ch <- retRes578019
return nil
}
var response interface{} = nil
var trailing interface{} = this.SafeValue(params, "trailing")
var trigger interface{} = this.SafeBool2(params, "stop", "trigger")
params = this.Omit(params, []interface{}{"stop", "trigger", "trailing"})
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(IsTrue(IsTrue((IsEqual(marketType, "swap"))) || IsTrue((IsEqual(marketType, "future")))) || IsTrue((!IsEqual(marginMode, nil)))) {
var clientOrderId interface{} = this.SafeString2(params, "clientOid", "clientOrderId")
params = this.Omit(params, "clientOrderId")
if IsTrue(!IsEqual(clientOrderId, nil)) {
AddElementToObject(request, "clientOid", clientOrderId)
}
}
var now interface{} = this.Milliseconds()
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(IsEqual(since, nil)) {
since = Subtract(now, 7776000000)
AddElementToObject(request, "startTime", since)
}
if IsTrue(IsEqual(marginMode, "isolated")) {
response = (<-this.PrivateMarginGetV2MarginIsolatedHistoryOrders(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginGetV2MarginCrossedHistoryOrders(this.Extend(request, params)))
PanicOnError(response)
}
} else if IsTrue(trigger) {
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchCanceledAndClosedOrders() requires a symbol argument")))
}
var endTime interface{} = this.SafeIntegerN(params, []interface{}{"endTime", "until"})
params = this.Omit(params, []interface{}{"until"})
if IsTrue(IsEqual(since, nil)) {
since = Subtract(now, 7776000000)
AddElementToObject(request, "startTime", since)
}
if IsTrue(IsEqual(endTime, nil)) {
AddElementToObject(request, "endTime", now)
}
response = (<-this.PrivateSpotGetV2SpotTradeHistoryPlanOrder(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotGetV2SpotTradeHistoryOrders(this.Extend(request, params)))
PanicOnError(response)
}
} else {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
if IsTrue(trailing) {
var planType interface{} = this.SafeString(params, "planType", "track_plan")
AddElementToObject(request, "planType", planType)
response = (<-this.PrivateMixGetV2MixOrderOrdersPlanHistory(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(trigger) {
var planType interface{} = this.SafeString(params, "planType", "normal_plan")
AddElementToObject(request, "planType", planType)
response = (<-this.PrivateMixGetV2MixOrderOrdersPlanHistory(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateMixGetV2MixOrderOrdersHistory(this.Extend(request, params)))
PanicOnError(response)
}
}
//
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700791085380,
// "data": [
// {
// "userId": "7264631750",
// "symbol": "BTCUSDT",
// "orderId": "1111499608327360513",
// "clientOid": "d0d4dad5-18d0-4869-a074-ec40bb47cba6",
// "price": "25000.0000000000000000",
// "size": "0.0002000000000000",
// "orderType": "limit",
// "side": "buy",
// "status": "cancelled",
// "priceAvg": "0",
// "baseVolume": "0.0000000000000000",
// "quoteVolume": "0.0000000000000000",
// "enterPointSource": "WEB",
// "feeDetail": "",
// "orderSource": "normal",
// "cTime": "1700728077966",
// "uTime": "1700728911471"
// },
// ]
// }
//
// spot stop
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700792099146,
// "data": {
// "nextFlag": false,
// "idLessThan": "1098757597417775104",
// "orderList": [
// {
// "orderId": "1111503385931620352",
// "clientOid": "1111503385910648832",
// "symbol": "BTCUSDT",
// "size": "0.0002",
// "planType": "AMOUNT",
// "executePrice": "25000",
// "triggerPrice": "26000",
// "status": "cancelled",
// "orderType": "limit",
// "side": "buy",
// "triggerType": "fill_price",
// "enterPointSource": "API",
// "cTime": "1700728978617",
// "uTime": "1700729666868"
// },
// ]
// }
// }
//
// spot margin
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700792381435,
// "data": {
// "orderList": [
// {
// "symbol": "BTCUSDT",
// "orderType": "limit",
// "enterPointSource": "WEB",
// "orderId": "1111456274707001345",
// "clientOid": "41e428dd305a4f668671b7f1ed00dc50",
// "loanType": "autoLoanAndRepay",
// "price": "27000",
// "side": "buy",
// "status": "cancelled",
// "baseSize": "0.0002",
// "quoteSize": "5.4",
// "priceAvg": "0",
// "size": "0",
// "amount": "0",
// "force": "gtc",
// "cTime": "1700717746427",
// "uTime": "1700717780636"
// },
// ],
// "maxId": "1111456274707001345",
// "minId": "1098396464990269440"
// }
// }
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700792674673,
// "data": {
// "entrustedList": [
// {
// "symbol": "BTCUSDT",
// "size": "0.002",
// "orderId": "1111498800817143808",
// "clientOid": "1111498800850698240",
// "baseVolume": "0",
// "fee": "0",
// "price": "25000",
// "priceAvg": "",
// "status": "canceled",
// "side": "buy",
// "force": "gtc",
// "totalProfits": "0",
// "posSide": "long",
// "marginCoin": "USDT",
// "quoteVolume": "0",
// "leverage": "20",
// "marginMode": "crossed",
// "enterPointSource": "web",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderType": "limit",
// "orderSource": "normal",
// "presetStopSurplusPrice": "",
// "presetStopLossPrice": "",
// "reduceOnly": "NO",
// "cTime": "1700727885449",
// "uTime": "1700727944563"
// },
// ],
// "endId": "1098397008323575809"
// }
// }
//
// swap and future stop
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700792938359,
// "data": {
// "entrustedList": [
// {
// "planType": "normal_plan",
// "symbol": "BTCUSDT",
// "size": "0.001",
// "orderId": "1111491399869075457",
// "clientOid": "1111491399869075456",
// "planStatus": "cancelled",
// "price": "27000",
// "feeDetail": null,
// "baseVolume": "0",
// "callbackRatio": "",
// "triggerPrice": "24000",
// "triggerType": "mark_price",
// "side": "buy",
// "posSide": "long",
// "marginCoin": "USDT",
// "marginMode": "crossed",
// "enterPointSource": "API",
// "tradeSide": "open",
// "posMode": "hedge_mode",
// "orderType": "limit",
// "stopSurplusTriggerPrice": "",
// "stopSurplusExecutePrice": "",
// "stopSurplusTriggerType": "fill_price",
// "stopLossTriggerPrice": "",
// "stopLossExecutePrice": "",
// "stopLossTriggerType": "fill_price",
// "cTime": "1700726120917",
// "uTime": "1700727879652"
// },
// ],
// "endId": "1098760007867502593"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(IsTrue((!IsEqual(marginMode, nil))) || IsTrue(trigger)) {
ch <- this.ParseOrders(this.SafeValue(data, "orderList", []interface{}{}), market, since, limit)
return nil
}
} else {
ch <- this.ParseOrders(this.SafeValue(data, "entrustedList", []interface{}{}), market, since, limit)
return nil
}
if IsTrue(IsString(response)) {
response = JsonParse(response)
}
var orders interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseOrders(orders, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchLedger
* @description fetch the history of changes, actions done by the user or operations that altered the balance of the user
* @see https://www.bitget.com/api-doc/spot/account/Get-Account-Bills
* @see https://www.bitget.com/api-doc/contract/account/Get-Account-Bill
* @param {string} [code] unified currency code, default is undefined
* @param {int} [since] timestamp in ms of the earliest ledger entry, default is undefined
* @param {int} [limit] max number of ledger entries to return, default is undefined
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] end time in ms
* @param {string} [params.symbol] *contract only* unified market symbol
* @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @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)
* @returns {object} a [ledger structure]{@link https://docs.ccxt.com/#/?id=ledger}
*/
func (this *bitget) FetchLedger(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
code := GetArg(optionalArgs, 0, nil)
_ = code
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes60558 := (<-this.LoadMarkets())
PanicOnError(retRes60558)
var symbol interface{} = this.SafeString(params, "symbol")
params = this.Omit(params, "symbol")
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
}
var marketType interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchLedger", market, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchLedger", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
var cursorReceived interface{} = nil
if IsTrue(!IsEqual(marketType, "spot")) {
cursorReceived = "endId"
}
retRes607719 := (<-this.FetchPaginatedCallCursor("fetchLedger", symbol, since, limit, params, cursorReceived, "idLessThan"))
PanicOnError(retRes607719)
ch <- retRes607719
return nil
}
var currency interface{} = nil
var request interface{} = map[string]interface{} {}
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "coin", GetValue(currency, "id"))
}
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var response interface{} = nil
if IsTrue(IsEqual(marketType, "spot")) {
response = (<-this.PrivateSpotGetV2SpotAccountBills(this.Extend(request, params)))
PanicOnError(response)
} else {
if IsTrue(!IsEqual(symbol, nil)) {
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response = (<-this.PrivateMixGetV2MixAccountBill(this.Extend(request, params)))
PanicOnError(response)
}
//
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700795836415,
// "data": [
// {
// "billId": "1111506298997215233",
// "coin": "USDT",
// "groupType": "transfer",
// "businessType": "transfer_out",
// "size": "-11.64958799",
// "balance": "0.00000000",
// "fees": "0.00000000",
// "cTime": "1700729673028"
// },
// ]
// }
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700795977890,
// "data": {
// "bills": [
// {
// "billId": "1111499428100472833",
// "symbol": "",
// "amount": "-11.64958799",
// "fee": "0",
// "feeByCoupon": "",
// "businessType": "trans_to_exchange",
// "coin": "USDT",
// "cTime": "1700728034996"
// },
// ],
// "endId": "1098396773329305606"
// }
// }
//
var data interface{} = this.SafeValue(response, "data")
if IsTrue(IsTrue((IsEqual(marketType, "swap"))) || IsTrue((IsEqual(marketType, "future")))) {
var bills interface{} = this.SafeValue(data, "bills", []interface{}{})
ch <- this.ParseLedger(bills, currency, since, limit)
return nil
}
ch <- this.ParseLedger(data, currency, since, limit)
return nil
}()
return ch
}
func (this *bitget) ParseLedgerEntry(item interface{}, optionalArgs ...interface{}) interface{} {
//
// spot
//
// {
// "billId": "1111506298997215233",
// "coin": "USDT",
// "groupType": "transfer",
// "businessType": "transfer_out",
// "size": "-11.64958799",
// "balance": "0.00000000",
// "fees": "0.00000000",
// "cTime": "1700729673028"
// }
//
// swap and future
//
// {
// "billId": "1111499428100472833",
// "symbol": "",
// "amount": "-11.64958799",
// "fee": "0",
// "feeByCoupon": "",
// "businessType": "trans_to_exchange",
// "coin": "USDT",
// "cTime": "1700728034996"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var currencyId interface{} = this.SafeString(item, "coin")
var code interface{} = this.SafeCurrencyCode(currencyId, currency)
currency = this.SafeCurrency(currencyId, currency)
var timestamp interface{} = this.SafeInteger(item, "cTime")
var after interface{} = this.SafeNumber(item, "balance")
var fee interface{} = this.SafeNumber2(item, "fees", "fee")
var amountRaw interface{} = this.SafeString2(item, "size", "amount")
var amount interface{} = this.ParseNumber(Precise.StringAbs(amountRaw))
var direction interface{} = "in"
if IsTrue(IsGreaterThanOrEqual(GetIndexOf(amountRaw, "-"), 0)) {
direction = "out"
}
return this.SafeLedgerEntry(map[string]interface{} {
"info": item,
"id": this.SafeString(item, "billId"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"direction": direction,
"account": nil,
"referenceId": nil,
"referenceAccount": nil,
"type": this.ParseLedgerType(this.SafeString(item, "businessType")),
"currency": code,
"amount": amount,
"before": nil,
"after": after,
"status": nil,
"fee": map[string]interface{} {
"currency": code,
"cost": fee,
},
}, currency)
}
func (this *bitget) ParseLedgerType(typeVar interface{}) interface{} {
var types interface{} = map[string]interface{} {
"trans_to_cross": "transfer",
"trans_from_cross": "transfer",
"trans_to_exchange": "transfer",
"trans_from_exchange": "transfer",
"trans_to_isolated": "transfer",
"trans_from_isolated": "transfer",
"trans_to_contract": "transfer",
"trans_from_contract": "transfer",
"trans_to_otc": "transfer",
"trans_from_otc": "transfer",
"open_long": "trade",
"close_long": "trade",
"open_short": "trade",
"close_short": "trade",
"force_close_long": "trade",
"force_close_short": "trade",
"burst_long_loss_query": "trade",
"burst_short_loss_query": "trade",
"force_buy": "trade",
"force_sell": "trade",
"burst_buy": "trade",
"burst_sell": "trade",
"delivery_long": "settlement",
"delivery_short": "settlement",
"contract_settle_fee": "fee",
"append_margin": "transaction",
"adjust_down_lever_append_margin": "transaction",
"reduce_margin": "transaction",
"auto_append_margin": "transaction",
"cash_gift_issue": "cashback",
"cash_gift_recycle": "cashback",
"bonus_issue": "rebate",
"bonus_recycle": "rebate",
"bonus_expired": "rebate",
"transfer_in": "transfer",
"transfer_out": "transfer",
"deposit": "deposit",
"withdraw": "withdrawal",
"buy": "trade",
"sell": "trade",
}
return this.SafeString(types, typeVar, typeVar)
}
/**
* @method
* @name bitget#fetchMyTrades
* @description fetch all trades made by the user
* @see https://www.bitget.com/api-doc/spot/trade/Get-Fills
* @see https://www.bitget.com/api-doc/contract/trade/Get-Order-Fills
* @see https://www.bitget.com/api-doc/margin/cross/trade/Get-Cross-Order-Fills
* @see https://www.bitget.com/api-doc/margin/isolated/trade/Get-Isolated-Transaction-Details
* @param {string} symbol unified market symbol
* @param {int} [since] the earliest time in ms to fetch trades for
* @param {int} [limit] the maximum number of trades structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch trades for
* @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)
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
*/
func (this *bitget) FetchMyTrades(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchMyTrades() requires a symbol argument")))
}
retRes62848 := (<-this.LoadMarkets())
PanicOnError(retRes62848)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchMyTrades", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchMyTrades", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
var cursorReceived interface{} = nil
if IsTrue(GetValue(market, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
cursorReceived = "minId"
}
} else {
cursorReceived = "endId"
}
retRes630619 := (<-this.FetchPaginatedCallCursor("fetchMyTrades", symbol, since, limit, params, cursorReceived, "idLessThan"))
PanicOnError(retRes630619)
ch <- retRes630619
return nil
}
var response interface{} = nil
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(GetValue(market, "spot")) {
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(IsEqual(since, nil)) {
AddElementToObject(request, "startTime", Subtract(this.Milliseconds(), 7776000000))
}
if IsTrue(IsEqual(marginMode, "isolated")) {
response = (<-this.PrivateMarginGetV2MarginIsolatedFills(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginGetV2MarginCrossedFills(this.Extend(request, params)))
PanicOnError(response)
}
} else {
response = (<-this.PrivateSpotGetV2SpotTradeFills(this.Extend(request, params)))
PanicOnError(response)
}
} else {
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response = (<-this.PrivateMixGetV2MixOrderFills(this.Extend(request, params)))
PanicOnError(response)
}
//
// spot
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700802995406,
// "data": [
// {
// "userId": "7264631750",
// "symbol": "BTCUSDT",
// "orderId": "1098394344925597696",
// "tradeId": "1098394344974925824",
// "orderType": "market",
// "side": "sell",
// "priceAvg": "28467.68",
// "size": "0.0002",
// "amount": "5.693536",
// "feeDetail": {
// "deduction": "no",
// "feeCoin": "USDT",
// "totalDeductionFee": "",
// "totalFee": "-0.005693536"
// },
// "tradeScope": "taker",
// "cTime": "1697603539699",
// "uTime": "1697603539754"
// }
// ]
// }
//
// spot margin
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700803176399,
// "data": {
// "fills": [
// {
// "orderId": "1099353730455318528",
// "tradeId": "1099353730627092481",
// "orderType": "market",
// "side": "sell",
// "priceAvg": "29543.7",
// "size": "0.0001",
// "amount": "2.95437",
// "tradeScope": "taker",
// "feeDetail": {
// "deduction": "no",
// "feeCoin": "USDT",
// "totalDeductionFee": "0",
// "totalFee": "-0.00295437"
// },
// "cTime": "1697832275063",
// "uTime": "1697832275150"
// },
// ],
// "minId": "1099353591699161118",
// "maxId": "1099353730627092481"
// }
// }
//
// swap and future
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700803357487,
// "data": {
// "fillList": [
// {
// "tradeId": "1111468664328269825",
// "symbol": "BTCUSDT",
// "orderId": "1111468664264753162",
// "price": "37271.4",
// "baseVolume": "0.001",
// "feeDetail": [
// {
// "deduction": "no",
// "feeCoin": "USDT",
// "totalDeductionFee": null,
// "totalFee": "-0.02236284"
// }
// ],
// "side": "buy",
// "quoteVolume": "37.2714",
// "profit": "-0.0007",
// "enterPointSource": "web",
// "tradeSide": "close",
// "posMode": "hedge_mode",
// "tradeScope": "taker",
// "cTime": "1700720700342"
// },
// ],
// "endId": "1099351587643699201"
// }
// }
//
var data interface{} = this.SafeValue(response, "data")
if IsTrue(IsTrue((GetValue(market, "swap"))) || IsTrue((GetValue(market, "future")))) {
var fillList interface{} = this.SafeList(data, "fillList", []interface{}{})
ch <- this.ParseTrades(fillList, market, since, limit)
return nil
} else if IsTrue(!IsEqual(marginMode, nil)) {
var fills interface{} = this.SafeList(data, "fills", []interface{}{})
ch <- this.ParseTrades(fills, market, since, limit)
return nil
}
ch <- this.ParseTrades(data, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchPosition
* @description fetch data on a single open contract trade position
* @see https://www.bitget.com/api-doc/contract/position/get-single-position
* @param {string} symbol unified market symbol of the market the position is held in
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *bitget) FetchPosition(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes64588 := (<-this.LoadMarkets())
PanicOnError(retRes64588)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"marginCoin": GetValue(market, "settleId"),
"productType": productType,
}
response:= (<-this.PrivateMixGetV2MixPositionSinglePosition(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700807531673,
// "data": [
// {
// "marginCoin": "USDT",
// "symbol": "BTCUSDT",
// "holdSide": "long",
// "openDelegateSize": "0",
// "marginSize": "3.73555",
// "available": "0.002",
// "locked": "0",
// "total": "0.002",
// "leverage": "20",
// "achievedProfits": "0",
// "openPriceAvg": "37355.5",
// "marginMode": "crossed",
// "posMode": "hedge_mode",
// "unrealizedPL": "0.007",
// "liquidationPrice": "31724.970702417",
// "keepMarginRate": "0.004",
// "markPrice": "37359",
// "marginRatio": "0.029599540355",
// "cTime": "1700807507275"
// }
// ]
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
var first interface{} = this.SafeDict(data, 0, map[string]interface{} {})
ch <- this.ParsePosition(first, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchPositions
* @description fetch all open positions
* @see https://www.bitget.com/api-doc/contract/position/get-all-position
* @see https://www.bitget.com/api-doc/contract/position/Get-History-Position
* @param {string[]} [symbols] list of unified market symbols
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.marginCoin] the settle currency of the positions, needs to match the productType
* @param {string} [params.productType] 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @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)
* @param {boolean} [params.useHistoryEndpoint] default false, when true will use the historic endpoint to fetch positions
* @param {string} [params.method] either (default) 'privateMixGetV2MixPositionAllPosition' or 'privateMixGetV2MixPositionHistoryPosition'
* @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *bitget) FetchPositions(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbols := GetArg(optionalArgs, 0, nil)
_ = symbols
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes65268 := (<-this.LoadMarkets())
PanicOnError(retRes65268)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchPositions", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes653019 := (<-this.FetchPaginatedCallCursor("fetchPositions", nil, nil, nil, params, "endId", "idLessThan"))
PanicOnError(retRes653019)
ch <- retRes653019
return nil
}
var method interface{} = nil
var useHistoryEndpoint interface{} = this.SafeBool(params, "useHistoryEndpoint", false)
if IsTrue(useHistoryEndpoint) {
method = "privateMixGetV2MixPositionHistoryPosition"
} else {
methodparamsVariable := this.HandleOptionAndParams(params, "fetchPositions", "method", "privateMixGetV2MixPositionAllPosition");
method = GetValue(methodparamsVariable,0);
params = GetValue(methodparamsVariable,1)
}
var market interface{} = nil
if IsTrue(!IsEqual(symbols, nil)) {
var first interface{} = this.SafeString(symbols, 0)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(first)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(first)
}
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"productType": productType,
}
var response interface{} = nil
var isHistory interface{} = false
if IsTrue(IsEqual(method, "privateMixGetV2MixPositionAllPosition")) {
var marginCoin interface{} = this.SafeString(params, "marginCoin", "USDT")
if IsTrue(!IsEqual(symbols, nil)) {
marginCoin = GetValue(market, "settleId")
} else if IsTrue(IsEqual(productType, "USDT-FUTURES")) {
marginCoin = "USDT"
} else if IsTrue(IsEqual(productType, "USDC-FUTURES")) {
marginCoin = "USDC"
} else if IsTrue(IsEqual(productType, "SUSDT-FUTURES")) {
marginCoin = "SUSDT"
} else if IsTrue(IsEqual(productType, "SUSDC-FUTURES")) {
marginCoin = "SUSDC"
} else if IsTrue(IsTrue((IsEqual(productType, "SCOIN-FUTURES"))) || IsTrue((IsEqual(productType, "COIN-FUTURES")))) {
if IsTrue(IsEqual(marginCoin, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchPositions() requires a marginCoin parameter that matches the productType")))
}
}
AddElementToObject(request, "marginCoin", marginCoin)
response = (<-this.PrivateMixGetV2MixPositionAllPosition(this.Extend(request, params)))
PanicOnError(response)
} else {
isHistory = true
if IsTrue(!IsEqual(market, nil)) {
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
response = (<-this.PrivateMixGetV2MixPositionHistoryPosition(this.Extend(request, params)))
PanicOnError(response)
}
//
// privateMixGetV2MixPositionAllPosition
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700807810221,
// "data": [
// {
// "marginCoin": "USDT",
// "symbol": "BTCUSDT",
// "holdSide": "long",
// "openDelegateSize": "0",
// "marginSize": "3.73555",
// "available": "0.002",
// "locked": "0",
// "total": "0.002",
// "leverage": "20",
// "achievedProfits": "0",
// "openPriceAvg": "37355.5",
// "marginMode": "crossed",
// "posMode": "hedge_mode",
// "unrealizedPL": "0.03",
// "liquidationPrice": "31725.023602417",
// "keepMarginRate": "0.004",
// "markPrice": "37370.5",
// "marginRatio": "0.029550120396",
// "cTime": "1700807507275"
// }
// ]
// }
//
// privateMixGetV2MixPositionHistoryPosition
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700808051002,
// "data": {
// "list": [
// {
// "symbol": "BTCUSDT",
// "marginCoin": "USDT",
// "holdSide": "long",
// "openAvgPrice": "37272.1",
// "closeAvgPrice": "37271.4",
// "marginMode": "crossed",
// "openTotalPos": "0.001",
// "closeTotalPos": "0.001",
// "pnl": "-0.0007",
// "netProfit": "-0.0454261",
// "totalFunding": "0",
// "openFee": "-0.02236326",
// "closeFee": "-0.02236284",
// "utime": "1700720700400",
// "ctime": "1700720651684"
// },
// ],
// "endId": "1099351653866962944"
// }
// }
//
var position interface{} = []interface{}{}
if !IsTrue(isHistory) {
position = this.SafeList(response, "data", []interface{}{})
} else {
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
position = this.SafeList(data, "list", []interface{}{})
}
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(position)); i++ {
AppendToArray(&result,this.ParsePosition(GetValue(position, i), market))
}
symbols = this.MarketSymbols(symbols)
ch <- this.FilterByArrayPositions(result, "symbol", symbols, false)
return nil
}()
return ch
}
func (this *bitget) ParsePosition(position interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchPosition
//
// {
// "marginCoin": "USDT",
// "symbol": "BTCUSDT",
// "holdSide": "long",
// "openDelegateSize": "0",
// "marginSize": "3.73555",
// "available": "0.002",
// "locked": "0",
// "total": "0.002",
// "leverage": "20",
// "achievedProfits": "0",
// "openPriceAvg": "37355.5",
// "marginMode": "crossed",
// "posMode": "hedge_mode",
// "unrealizedPL": "0.007",
// "liquidationPrice": "31724.970702417",
// "keepMarginRate": "0.004",
// "markPrice": "37359",
// "marginRatio": "0.029599540355",
// "cTime": "1700807507275"
// }
//
// fetchPositions: privateMixGetV2MixPositionAllPosition
//
// {
// "marginCoin": "USDT",
// "symbol": "BTCUSDT",
// "holdSide": "long",
// "openDelegateSize": "0",
// "marginSize": "3.73555",
// "available": "0.002",
// "locked": "0",
// "total": "0.002",
// "leverage": "20",
// "achievedProfits": "0",
// "openPriceAvg": "37355.5",
// "marginMode": "crossed",
// "posMode": "hedge_mode",
// "unrealizedPL": "0.03",
// "liquidationPrice": "31725.023602417",
// "keepMarginRate": "0.004",
// "markPrice": "37370.5",
// "marginRatio": "0.029550120396",
// "cTime": "1700807507275"
// }
//
// fetchPositionsHistory: privateMixGetV2MixPositionHistoryPosition
//
// {
// "symbol": "BTCUSDT",
// "marginCoin": "USDT",
// "holdSide": "long",
// "openAvgPrice": "37272.1",
// "closeAvgPrice": "37271.4",
// "marginMode": "crossed",
// "openTotalPos": "0.001",
// "closeTotalPos": "0.001",
// "pnl": "-0.0007",
// "netProfit": "-0.0454261",
// "totalFunding": "0",
// "openFee": "-0.02236326",
// "closeFee": "-0.02236284",
// "utime": "1700720700400",
// "ctime": "1700720651684"
// }
//
// closeAllPositions
//
// {
// "orderId": "1120923953904893955",
// "clientOid": "1120923953904893956"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(position, "symbol")
market = this.SafeMarket(marketId, market, nil, "contract")
var symbol interface{} = GetValue(market, "symbol")
var timestamp interface{} = this.SafeInteger2(position, "cTime", "ctime")
var marginMode interface{} = this.SafeString(position, "marginMode")
var collateral interface{} = nil
var initialMargin interface{} = nil
var unrealizedPnl interface{} = this.SafeString(position, "unrealizedPL")
var rawCollateral interface{} = this.SafeString(position, "marginSize")
if IsTrue(IsEqual(marginMode, "isolated")) {
collateral = Precise.StringAdd(rawCollateral, unrealizedPnl)
} else if IsTrue(IsEqual(marginMode, "crossed")) {
marginMode = "cross"
initialMargin = rawCollateral
}
var holdMode interface{} = this.SafeString(position, "posMode")
var hedged interface{} = nil
if IsTrue(IsEqual(holdMode, "hedge_mode")) {
hedged = true
} else if IsTrue(IsEqual(holdMode, "one_way_mode")) {
hedged = false
}
var side interface{} = this.SafeString(position, "holdSide")
var leverage interface{} = this.SafeString(position, "leverage")
var contractSizeNumber interface{} = this.SafeValue(market, "contractSize")
var contractSize interface{} = this.NumberToString(contractSizeNumber)
var baseAmount interface{} = this.SafeString(position, "total")
var entryPrice interface{} = this.SafeString2(position, "openPriceAvg", "openAvgPrice")
var maintenanceMarginPercentage interface{} = this.SafeString(position, "keepMarginRate")
var openNotional interface{} = Precise.StringMul(entryPrice, baseAmount)
if IsTrue(IsEqual(initialMargin, nil)) {
initialMargin = Precise.StringDiv(openNotional, leverage)
}
var contracts interface{} = this.ParseNumber(Precise.StringDiv(baseAmount, contractSize))
if IsTrue(IsEqual(contracts, nil)) {
contracts = this.SafeNumber(position, "closeTotalPos")
}
var markPrice interface{} = this.SafeString(position, "markPrice")
var notional interface{} = Precise.StringMul(baseAmount, markPrice)
var initialMarginPercentage interface{} = Precise.StringDiv(initialMargin, notional)
var liquidationPrice interface{} = this.ParseNumber(this.OmitZero(this.SafeString(position, "liquidationPrice")))
var calcTakerFeeRate interface{} = "0.0006"
var calcTakerFeeMult interface{} = "0.9994"
if IsTrue(IsTrue(IsTrue((IsEqual(liquidationPrice, nil))) && IsTrue((IsEqual(marginMode, "isolated")))) && IsTrue(Precise.StringGt(baseAmount, "0"))) {
var signedMargin interface{} = Precise.StringDiv(rawCollateral, baseAmount)
var signedMmp interface{} = maintenanceMarginPercentage
if IsTrue(IsEqual(side, "short")) {
signedMargin = Precise.StringNeg(signedMargin)
signedMmp = Precise.StringNeg(signedMmp)
}
var mmrMinusOne interface{} = Precise.StringSub("1", signedMmp)
var numerator interface{} = Precise.StringSub(entryPrice, signedMargin)
if IsTrue(IsEqual(side, "long")) {
mmrMinusOne = Precise.StringMul(mmrMinusOne, calcTakerFeeMult)
} else {
numerator = Precise.StringMul(numerator, calcTakerFeeMult)
}
liquidationPrice = this.ParseNumber(Precise.StringDiv(numerator, mmrMinusOne))
}
var feeToClose interface{} = Precise.StringMul(notional, calcTakerFeeRate)
var maintenanceMargin interface{} = Precise.StringAdd(Precise.StringMul(maintenanceMarginPercentage, notional), feeToClose)
var percentage interface{} = Precise.StringMul(Precise.StringDiv(unrealizedPnl, initialMargin, 4), "100")
return this.SafePosition(map[string]interface{} {
"info": position,
"id": this.SafeString(position, "orderId"),
"symbol": symbol,
"notional": this.ParseNumber(notional),
"marginMode": marginMode,
"liquidationPrice": liquidationPrice,
"entryPrice": this.ParseNumber(entryPrice),
"unrealizedPnl": this.ParseNumber(unrealizedPnl),
"realizedPnl": this.SafeNumber(position, "pnl"),
"percentage": this.ParseNumber(percentage),
"contracts": contracts,
"contractSize": contractSizeNumber,
"markPrice": this.ParseNumber(markPrice),
"lastPrice": this.SafeNumber(position, "closeAvgPrice"),
"side": side,
"hedged": hedged,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"lastUpdateTimestamp": this.SafeInteger(position, "utime"),
"maintenanceMargin": this.ParseNumber(maintenanceMargin),
"maintenanceMarginPercentage": this.ParseNumber(maintenanceMarginPercentage),
"collateral": this.ParseNumber(collateral),
"initialMargin": this.ParseNumber(initialMargin),
"initialMarginPercentage": this.ParseNumber(initialMarginPercentage),
"leverage": this.ParseNumber(leverage),
"marginRatio": this.SafeNumber(position, "marginRatio"),
"stopLossPrice": nil,
"takeProfitPrice": nil,
})
}
/**
* @method
* @name bitget#fetchFundingRateHistory
* @description fetches historical funding rate prices
* @see https://www.bitget.com/api-doc/contract/market/Get-History-Funding-Rate
* @param {string} symbol unified symbol of the market to fetch the funding rate history for
* @param {int} [since] timestamp in ms of the earliest funding rate to fetch
* @param {int} [limit] the maximum amount of funding rate structures to fetch
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @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)
* @returns {object[]} a list of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure}
*/
func (this *bitget) FetchFundingRateHistory(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchFundingRateHistory() requires a symbol argument")))
}
retRes68478 := (<-this.LoadMarkets())
PanicOnError(retRes68478)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchFundingRateHistory", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes685119 := (<-this.FetchPaginatedCallIncremental("fetchFundingRateHistory", symbol, since, limit, params, "pageNo", 100))
PanicOnError(retRes685119)
ch <- retRes685119
return nil
}
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"productType": productType,
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "pageSize", limit)
}
response:= (<-this.PublicMixGetV2MixMarketHistoryFundRate(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1652406728393,
// "data": [
// {
// "symbol": "BTCUSDT",
// "fundingRate": "-0.0003",
// "fundingTime": "1652396400000"
// },
// ]
// }
//
var data interface{} = this.SafeValue(response, "data", []interface{}{})
var rates interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
var entry interface{} = GetValue(data, i)
var marketId interface{} = this.SafeString(entry, "symbol")
var symbolInner interface{} = this.SafeSymbol(marketId, market)
var timestamp interface{} = this.SafeInteger(entry, "fundingTime")
AppendToArray(&rates,map[string]interface{} {
"info": entry,
"symbol": symbolInner,
"fundingRate": this.SafeNumber(entry, "fundingRate"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
})
}
var sorted interface{} = this.SortBy(rates, "timestamp")
ch <- this.FilterBySymbolSinceLimit(sorted, GetValue(market, "symbol"), since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchFundingRate
* @description fetch the current funding rate
* @see https://www.bitget.com/api-doc/contract/market/Get-Current-Funding-Rate
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
*/
func (this *bitget) FetchFundingRate(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes69168 := (<-this.LoadMarkets())
PanicOnError(retRes69168)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
if !IsTrue(GetValue(market, "swap")) {
panic(BadSymbol(Add(this.Id, " fetchFundingRate() supports swap contracts only")))
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"productType": productType,
}
response:= (<-this.PublicMixGetV2MixMarketCurrentFundRate(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700811542124,
// "data": [
// {
// "symbol": "BTCUSDT",
// "fundingRate": "0.000106"
// }
// ]
// }
//
var data interface{} = this.SafeValue(response, "data", []interface{}{})
ch <- this.ParseFundingRate(GetValue(data, 0), market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchFundingRates
* @description fetch the current funding rates for all markets
* @see https://www.bitget.com/api-doc/contract/market/Get-All-Symbol-Ticker
* @param {string[]} [symbols] list of unified market symbols
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.subType] *contract only* 'linear', 'inverse'
* @param {string} [params.productType] *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @returns {object} a dictionary of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rates-structure}, indexed by market symbols
*/
func (this *bitget) FetchFundingRates(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbols := GetArg(optionalArgs, 0, nil)
_ = symbols
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes69648 := (<-this.LoadMarkets())
PanicOnError(retRes69648)
var market interface{} = nil
if IsTrue(!IsEqual(symbols, nil)) {
var symbol interface{} = this.SafeValue(symbols, 0)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
}
var request interface{} = map[string]interface{} {}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
AddElementToObject(request, "productType", productType)
response:= (<-this.PublicMixGetV2MixMarketTickers(this.Extend(request, params)))
PanicOnError(response)
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700533773477,
// "data": [
// {
// "symbol": "BTCUSD",
// "lastPr": "29904.5",
// "askPr": "29904.5",
// "bidPr": "29903.5",
// "bidSz": "0.5091",
// "askSz": "2.2694",
// "high24h": "0",
// "low24h": "0",
// "ts": "1695794271400",
// "change24h": "0",
// "baseVolume": "0",
// "quoteVolume": "0",
// "usdtVolume": "0",
// "openUtc": "0",
// "changeUtc24h": "0",
// "indexPrice": "29132.353333",
// "fundingRate": "-0.0007",
// "holdingAmount": "125.6844",
// "deliveryStartTime": null,
// "deliveryTime": null,
// "deliveryStatus": "delivery_normal",
// "open24h": "0",
// "markPrice": "12345"
// },
// ]
// }
symbols = this.MarketSymbols(symbols)
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseFundingRates(data, symbols)
return nil
}()
return ch
}
func (this *bitget) ParseFundingRate(contract interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchFundingRate
//
// {
// "symbol": "BTCUSDT",
// "fundingRate": "-0.000182"
// }
//
// fetchFundingInterval
//
// {
// "symbol": "BTCUSDT",
// "nextFundingTime": "1727942400000",
// "ratePeriod": "8"
// }
// fetchFundingRates
// {
// "symbol": "BTCUSD",
// "lastPr": "29904.5",
// "askPr": "29904.5",
// "bidPr": "29903.5",
// "bidSz": "0.5091",
// "askSz": "2.2694",
// "high24h": "0",
// "low24h": "0",
// "ts": "1695794271400",
// "change24h": "0",
// "baseVolume": "0",
// "quoteVolume": "0",
// "usdtVolume": "0",
// "openUtc": "0",
// "changeUtc24h": "0",
// "indexPrice": "29132.353333",
// "fundingRate": "-0.0007",
// "holdingAmount": "125.6844",
// "deliveryStartTime": null,
// "deliveryTime": null,
// "deliveryStatus": "delivery_normal",
// "open24h": "0",
// "markPrice": "12345"
// }
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(contract, "symbol")
var symbol interface{} = this.SafeSymbol(marketId, market, nil, "swap")
var fundingTimestamp interface{} = this.SafeInteger(contract, "nextFundingTime")
var interval interface{} = this.SafeString(contract, "ratePeriod")
var timestamp interface{} = this.SafeInteger(contract, "ts")
var markPrice interface{} = this.SafeNumber(contract, "markPrice")
var indexPrice interface{} = this.SafeNumber(contract, "indexPrice")
var intervalString interface{} = nil
if IsTrue(!IsEqual(interval, nil)) {
intervalString = Add(interval, "h")
}
return map[string]interface{} {
"info": contract,
"symbol": symbol,
"markPrice": markPrice,
"indexPrice": indexPrice,
"interestRate": nil,
"estimatedSettlePrice": nil,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"fundingRate": this.SafeNumber(contract, "fundingRate"),
"fundingTimestamp": fundingTimestamp,
"fundingDatetime": this.Iso8601(fundingTimestamp),
"nextFundingRate": nil,
"nextFundingTimestamp": nil,
"nextFundingDatetime": nil,
"previousFundingRate": nil,
"previousFundingTimestamp": nil,
"previousFundingDatetime": nil,
"interval": intervalString,
}
}
/**
* @method
* @name bitget#fetchFundingHistory
* @description fetch the funding history
* @see https://www.bitget.com/api-doc/contract/account/Get-Account-Bill
* @param {string} symbol unified market symbol
* @param {int} [since] the starting timestamp in milliseconds
* @param {int} [limit] the number of entries to return
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch funding history for
* @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)
* @returns {object[]} a list of [funding history structures]{@link https://docs.ccxt.com/#/?id=funding-history-structure}
*/
func (this *bitget) FetchFundingHistory(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes71078 := (<-this.LoadMarkets())
PanicOnError(retRes71078)
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchFundingHistory() requires a symbol argument")))
}
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchFundingHistory", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes711419 := (<-this.FetchPaginatedCallCursor("fetchFundingHistory", symbol, since, limit, params, "endId", "idLessThan"))
PanicOnError(retRes711419)
ch <- retRes711419
return nil
}
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
if !IsTrue(GetValue(market, "swap")) {
panic(BadSymbol(Add(this.Id, " fetchFundingHistory() supports swap contracts only")))
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"marginCoin": GetValue(market, "settleId"),
"businessType": "contract_settle_fee",
"productType": productType,
}
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PrivateMixGetV2MixAccountBill(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700795977890,
// "data": {
// "bills": [
// {
// "billId": "1111499428100472833",
// "symbol": "BTCUSDT",
// "amount": "-0.004992",
// "fee": "0",
// "feeByCoupon": "",
// "businessType": "contract_settle_fee",
// "coin": "USDT",
// "cTime": "1700728034996"
// },
// ],
// "endId": "1098396773329305606"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var result interface{} = this.SafeValue(data, "bills", []interface{}{})
ch <- this.ParseFundingHistories(result, market, since, limit)
return nil
}()
return ch
}
func (this *bitget) ParseFundingHistory(contract interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "billId": "1111499428100472833",
// "symbol": "BTCUSDT",
// "amount": "-0.004992",
// "fee": "0",
// "feeByCoupon": "",
// "businessType": "contract_settle_fee",
// "coin": "USDT",
// "cTime": "1700728034996"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(contract, "symbol")
var currencyId interface{} = this.SafeString(contract, "coin")
var timestamp interface{} = this.SafeInteger(contract, "cTime")
return map[string]interface{} {
"info": contract,
"symbol": this.SafeSymbol(marketId, market, nil, "swap"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"code": this.SafeCurrencyCode(currencyId),
"amount": this.SafeNumber(contract, "amount"),
"id": this.SafeString(contract, "billId"),
}
}
func (this *bitget) ParseFundingHistories(contracts interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(contracts)); i++ {
var contract interface{} = GetValue(contracts, i)
var business interface{} = this.SafeString(contract, "businessType")
if IsTrue(!IsEqual(business, "contract_settle_fee")) {
continue
}
AppendToArray(&result,this.ParseFundingHistory(contract, market))
}
var sorted interface{} = this.SortBy(result, "timestamp")
return this.FilterBySinceLimit(sorted, since, limit)
}
func (this *bitget) ModifyMarginHelper(symbol interface{}, amount interface{}, typeVar interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes72128 := (<-this.LoadMarkets())
PanicOnError(retRes72128)
var holdSide interface{} = this.SafeString(params, "holdSide")
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"marginCoin": GetValue(market, "settleId"),
"amount": this.AmountToPrecision(symbol, amount),
"holdSide": holdSide,
"productType": productType,
}
params = this.Omit(params, "holdSide")
response:= (<-this.PrivateMixPostV2MixAccountSetMargin(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700813444618,
// "data": ""
// }
//
ch <- this.Extend(this.ParseMarginModification(response, market), map[string]interface{} {
"amount": this.ParseNumber(amount),
"type": typeVar,
})
return nil
}()
return ch
}
func (this *bitget) ParseMarginModification(data interface{}, optionalArgs ...interface{}) interface{} {
//
// addMargin/reduceMargin
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700813444618,
// "data": ""
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var errorCode interface{} = this.SafeString(data, "code")
var status interface{} = Ternary(IsTrue((IsEqual(errorCode, "00000"))), "ok", "failed")
return map[string]interface{} {
"info": data,
"symbol": GetValue(market, "symbol"),
"type": nil,
"marginMode": "isolated",
"amount": nil,
"total": nil,
"code": GetValue(market, "settle"),
"status": status,
"timestamp": nil,
"datetime": nil,
}
}
/**
* @method
* @name bitget#reduceMargin
* @description remove margin from a position
* @see https://www.bitget.com/api-doc/contract/account/Change-Margin
* @param {string} symbol unified market symbol
* @param {float} amount the amount of margin to remove
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=reduce-margin-structure}
*/
func (this *bitget) ReduceMargin(symbol interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
if IsTrue(IsGreaterThan(amount, 0)) {
panic(BadRequest(Add(this.Id, " reduceMargin() amount parameter must be a negative value")))
}
var holdSide interface{} = this.SafeString(params, "holdSide")
if IsTrue(IsEqual(holdSide, nil)) {
panic(ArgumentsRequired(Add(this.Id, " reduceMargin() requires a holdSide parameter, either long or short")))
}
retRes729215 := (<-this.ModifyMarginHelper(symbol, amount, "reduce", params))
PanicOnError(retRes729215)
ch <- retRes729215
return nil
}()
return ch
}
/**
* @method
* @name bitget#addMargin
* @description add margin
* @see https://www.bitget.com/api-doc/contract/account/Change-Margin
* @param {string} symbol unified market symbol
* @param {float} amount the amount of margin to add
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=add-margin-structure}
*/
func (this *bitget) AddMargin(symbol interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
var holdSide interface{} = this.SafeString(params, "holdSide")
if IsTrue(IsEqual(holdSide, nil)) {
panic(ArgumentsRequired(Add(this.Id, " addMargin() requires a holdSide parameter, either long or short")))
}
retRes731015 := (<-this.ModifyMarginHelper(symbol, amount, "add", params))
PanicOnError(retRes731015)
ch <- retRes731015
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchLeverage
* @description fetch the set leverage for a market
* @see https://www.bitget.com/api-doc/contract/account/Get-Single-Account
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [leverage structure]{@link https://docs.ccxt.com/#/?id=leverage-structure}
*/
func (this *bitget) FetchLeverage(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes73238 := (<-this.LoadMarkets())
PanicOnError(retRes73238)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"marginCoin": GetValue(market, "settleId"),
"productType": productType,
}
response:= (<-this.PrivateMixGetV2MixAccountAccount(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1709366911964,
// "data": {
// "marginCoin": "USDT",
// "locked": "0",
// "available": "0",
// "crossedMaxAvailable": "0",
// "isolatedMaxAvailable": "0",
// "maxTransferOut": "0",
// "accountEquity": "0",
// "usdtEquity": "0.000000009166",
// "btcEquity": "0",
// "crossedRiskRate": "0",
// "crossedMarginLeverage": 20,
// "isolatedLongLever": 20,
// "isolatedShortLever": 20,
// "marginMode": "crossed",
// "posMode": "hedge_mode",
// "unrealizedPL": "0",
// "coupon": "0",
// "crossedUnrealizedPL": "0",
// "isolatedUnrealizedPL": ""
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
ch <- this.ParseLeverage(data, market)
return nil
}()
return ch
}
func (this *bitget) ParseLeverage(leverage interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
return map[string]interface{} {
"info": leverage,
"symbol": GetValue(market, "symbol"),
"marginMode": "isolated",
"longLeverage": this.SafeInteger(leverage, "isolatedLongLever"),
"shortLeverage": this.SafeInteger(leverage, "isolatedShortLever"),
}
}
/**
* @method
* @name bitget#setLeverage
* @description set the level of leverage for a market
* @see https://www.bitget.com/api-doc/contract/account/Change-Leverage
* @param {int} leverage the rate of leverage
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.holdSide] *isolated only* position direction, 'long' or 'short'
* @returns {object} response from the exchange
*/
func (this *bitget) SetLeverage(leverage interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " setLeverage() requires a symbol argument")))
}
retRes73978 := (<-this.LoadMarkets())
PanicOnError(retRes73978)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"marginCoin": GetValue(market, "settleId"),
"leverage": this.NumberToString(leverage),
"productType": productType,
}
response:= (<-this.PrivateMixPostV2MixAccountSetLeverage(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700864711517,
// "data": {
// "symbol": "BTCUSDT",
// "marginCoin": "USDT",
// "longLeverage": "25",
// "shortLeverage": "25",
// "crossMarginLeverage": "25",
// "marginMode": "crossed"
// }
// }
//
ch <- response
return nil
}()
return ch
}
/**
* @method
* @name bitget#setMarginMode
* @description set margin mode to 'cross' or 'isolated'
* @see https://www.bitget.com/api-doc/contract/account/Change-Margin-Mode
* @param {string} marginMode 'cross' or 'isolated'
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} response from the exchange
*/
func (this *bitget) SetMarginMode(marginMode interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " setMarginMode() requires a symbol argument")))
}
marginMode = ToLower(marginMode)
if IsTrue(IsEqual(marginMode, "cross")) {
marginMode = "crossed"
}
if IsTrue(IsTrue((!IsEqual(marginMode, "isolated"))) && IsTrue((!IsEqual(marginMode, "crossed")))) {
panic(ArgumentsRequired(Add(this.Id, " setMarginMode() marginMode must be either isolated or crossed (cross)")))
}
retRes74558 := (<-this.LoadMarkets())
PanicOnError(retRes74558)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"marginCoin": GetValue(market, "settleId"),
"marginMode": marginMode,
"productType": productType,
}
response:= (<-this.PrivateMixPostV2MixAccountSetMarginMode(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700865205552,
// "data": {
// "symbol": "BTCUSDT",
// "marginCoin": "USDT",
// "longLeverage": "20",
// "shortLeverage": "3",
// "marginMode": "isolated"
// }
// }
//
ch <- response
return nil
}()
return ch
}
/**
* @method
* @name bitget#setPositionMode
* @description set hedged to true or false for a market
* @see https://www.bitget.com/api-doc/contract/account/Change-Hold-Mode
* @param {bool} hedged set to true to use dualSidePosition
* @param {string} symbol not used by bitget setPositionMode ()
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.productType] required if symbol is undefined: 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @returns {object} response from the exchange
*/
func (this *bitget) SetPositionMode(hedged interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes75028 := (<-this.LoadMarkets())
PanicOnError(retRes75028)
var posMode interface{} = Ternary(IsTrue(hedged), "hedge_mode", "one_way_mode")
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"posMode": posMode,
"productType": productType,
}
response:= (<-this.PrivateMixPostV2MixAccountSetPositionMode(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700865608009,
// "data": {
// "posMode": "hedge_mode"
// }
// }
//
ch <- response
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchOpenInterest
* @description retrieves the open interest of a contract trading pair
* @see https://www.bitget.com/api-doc/contract/market/Get-Open-Interest
* @param {string} symbol unified CCXT market symbol
* @param {object} [params] exchange specific parameters
* @returns {object} an open interest structure{@link https://docs.ccxt.com/#/?id=open-interest-structure}
*/
func (this *bitget) FetchOpenInterest(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes75448 := (<-this.LoadMarkets())
PanicOnError(retRes75448)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
if !IsTrue(GetValue(market, "contract")) {
panic(BadRequest(Add(this.Id, " fetchOpenInterest() supports contract markets only")))
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"productType": productType,
}
response:= (<-this.PublicMixGetV2MixMarketOpenInterest(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700866041022,
// "data": {
// "openInterestList": [
// {
// "symbol": "BTCUSDT",
// "size": "52234.134"
// }
// ],
// "ts": "1700866041023"
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
ch <- this.ParseOpenInterest(data, market)
return nil
}()
return ch
}
func (this *bitget) ParseOpenInterest(interest interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "openInterestList": [
// {
// "symbol": "BTCUSDT",
// "size": "52234.134"
// }
// ],
// "ts": "1700866041023"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var data interface{} = this.SafeValue(interest, "openInterestList", []interface{}{})
var timestamp interface{} = this.SafeInteger(interest, "ts")
var marketId interface{} = this.SafeString(GetValue(data, 0), "symbol")
return this.SafeOpenInterest(map[string]interface{} {
"symbol": this.SafeSymbol(marketId, market, nil, "contract"),
"openInterestAmount": this.SafeNumber(GetValue(data, 0), "size"),
"openInterestValue": nil,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"info": interest,
}, market)
}
/**
* @method
* @name bitget#fetchTransfers
* @description fetch a history of internal transfers made on an account
* @see https://www.bitget.com/api-doc/spot/account/Get-Account-TransferRecords
* @param {string} code unified currency code of the currency transferred
* @param {int} [since] the earliest time in ms to fetch transfers for
* @param {int} [limit] the maximum number of transfers structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch entries for
* @returns {object[]} a list of [transfer structures]{@link https://docs.ccxt.com/#/?id=transfer-structure}
*/
func (this *bitget) FetchTransfers(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
code := GetArg(optionalArgs, 0, nil)
_ = code
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(code, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchTransfers() requires a code argument")))
}
retRes76248 := (<-this.LoadMarkets())
PanicOnError(retRes76248)
var typeVar interface{} = nil
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchTransfers", nil, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
var fromAccount interface{} = this.SafeString(params, "fromAccount", typeVar)
params = this.Omit(params, "fromAccount")
var accountsByType interface{} = this.SafeValue(this.Options, "accountsByType", map[string]interface{} {})
typeVar = this.SafeString(accountsByType, fromAccount)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"fromType": typeVar,
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
response:= (<-this.PrivateSpotGetV2SpotAccountTransferRecords(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700873854651,
// "data": [
// {
// "coin": "USDT",
// "status": "Successful",
// "toType": "crossed_margin",
// "toSymbol": "",
// "fromType": "spot",
// "fromSymbol": "",
// "size": "11.64958799",
// "ts": "1700729673028",
// "clientOid": "1111506298504744960",
// "transferId": "24930940"
// },
// ]
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseTransfers(data, currency, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#transfer
* @description transfer currency internally between wallets on the same account
* @see https://www.bitget.com/api-doc/spot/account/Wallet-Transfer
* @param {string} code unified currency code
* @param {float} amount amount to transfer
* @param {string} fromAccount account to transfer from
* @param {string} toAccount account to transfer to
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.symbol] unified CCXT market symbol, required when transferring to or from an account type that is a leveraged position-by-position account
* @param {string} [params.clientOid] custom id
* @returns {object} a [transfer structure]{@link https://docs.ccxt.com/#/?id=transfer-structure}
*/
func (this *bitget) Transfer(code interface{}, amount interface{}, fromAccount interface{}, toAccount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes76848 := (<-this.LoadMarkets())
PanicOnError(retRes76848)
var currency interface{} = this.Currency(code)
var accountsByType interface{} = this.SafeValue(this.Options, "accountsByType", map[string]interface{} {})
var fromType interface{} = this.SafeString(accountsByType, fromAccount)
var toType interface{} = this.SafeString(accountsByType, toAccount)
var request interface{} = map[string]interface{} {
"fromType": fromType,
"toType": toType,
"amount": amount,
"coin": GetValue(currency, "id"),
}
var symbol interface{} = this.SafeString(params, "symbol")
params = this.Omit(params, "symbol")
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
response:= (<-this.PrivateSpotPostV2SpotWalletTransfer(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700874302021,
// "data": {
// "transferId": "1112112916581847040",
// "clientOrderId": null
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
AddElementToObject(data, "ts", this.SafeInteger(response, "requestTime"))
ch <- this.ParseTransfer(data, currency)
return nil
}()
return ch
}
func (this *bitget) ParseTransfer(transfer interface{}, optionalArgs ...interface{}) interface{} {
//
// transfer
//
// {
// "transferId": "1112112916581847040",
// "clientOrderId": null,
// "ts": 1700874302021
// }
//
// fetchTransfers
//
// {
// "coin": "USDT",
// "status": "Successful",
// "toType": "crossed_margin",
// "toSymbol": "",
// "fromType": "spot",
// "fromSymbol": "",
// "size": "11.64958799",
// "ts": "1700729673028",
// "clientOid": "1111506298504744960",
// "transferId": "24930940"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var timestamp interface{} = this.SafeInteger(transfer, "ts")
var status interface{} = this.SafeStringLower(transfer, "status")
var currencyId interface{} = this.SafeString(transfer, "coin")
var fromAccountRaw interface{} = this.SafeString(transfer, "fromType")
var accountsById interface{} = this.SafeValue(this.Options, "accountsById", map[string]interface{} {})
var fromAccount interface{} = this.SafeString(accountsById, fromAccountRaw, fromAccountRaw)
var toAccountRaw interface{} = this.SafeString(transfer, "toType")
var toAccount interface{} = this.SafeString(accountsById, toAccountRaw, toAccountRaw)
return map[string]interface{} {
"info": transfer,
"id": this.SafeString(transfer, "transferId"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"currency": this.SafeCurrencyCode(currencyId, currency),
"amount": this.SafeNumber(transfer, "size"),
"fromAccount": fromAccount,
"toAccount": toAccount,
"status": this.ParseTransferStatus(status),
}
}
func (this *bitget) ParseTransferStatus(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"successful": "ok",
}
return this.SafeString(statuses, status, status)
}
func (this *bitget) ParseDepositWithdrawFee(fee interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "chains": [
// {
// "browserUrl": "https://blockchair.com/bitcoin/transaction/",
// "chain": "BTC",
// "depositConfirm": "1",
// "extraWithdrawFee": "0",
// "minDepositAmount": "0.0001",
// "minWithdrawAmount": "0.005",
// "needTag": "false",
// "rechargeable": "true",
// "withdrawConfirm": "1",
// "withdrawFee": "0.0004",
// "withdrawable": "true"
// },
// ],
// "coin": "BTC",
// "coinId": "1",
// "transfer": "true""
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var chains interface{} = this.SafeValue(fee, "chains", []interface{}{})
var chainsLength interface{} = GetArrayLength(chains)
var result interface{} = map[string]interface{} {
"info": fee,
"withdraw": map[string]interface{} {
"fee": nil,
"percentage": nil,
},
"deposit": map[string]interface{} {
"fee": nil,
"percentage": nil,
},
"networks": map[string]interface{} {},
}
for i := 0; IsLessThan(i, chainsLength); i++ {
var chain interface{} = GetValue(chains, i)
var networkId interface{} = this.SafeString(chain, "chain")
var currencyCode interface{} = this.SafeString(currency, "code")
var networkCode interface{} = this.NetworkIdToCode(networkId, currencyCode)
AddElementToObject(GetValue(result, "networks"), networkCode, map[string]interface{} {
"deposit": map[string]interface{} {
"fee": nil,
"percentage": nil,
},
"withdraw": map[string]interface{} {
"fee": this.SafeNumber(chain, "withdrawFee"),
"percentage": false,
},
})
if IsTrue(IsEqual(chainsLength, 1)) {
AddElementToObject(GetValue(result, "withdraw"), "fee", this.SafeNumber(chain, "withdrawFee"))
AddElementToObject(GetValue(result, "withdraw"), "percentage", false)
}
}
return result
}
/**
* @method
* @name bitget#fetchDepositWithdrawFees
* @description fetch deposit and withdraw fees
* @see https://www.bitget.com/api-doc/spot/market/Get-Coin-List
* @param {string[]|undefined} codes list of unified currency codes
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a list of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure}
*/
func (this *bitget) FetchDepositWithdrawFees(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
codes := GetArg(optionalArgs, 0, nil)
_ = codes
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes78368 := (<-this.LoadMarkets())
PanicOnError(retRes78368)
response:= (<-this.PublicSpotGetV2SpotPublicCoins(params))
PanicOnError(response)
//
// {
// "code": "00000",
// "data": [
// {
// "chains": [
// {
// "browserUrl": "https://blockchair.com/bitcoin/transaction/",
// "chain": "BTC",
// "depositConfirm": "1",
// "extraWithdrawFee": "0",
// "minDepositAmount": "0.0001",
// "minWithdrawAmount": "0.005",
// "needTag": "false",
// "rechargeable": "true",
// "withdrawConfirm": "1",
// "withdrawFee": "0.0004",
// "withdrawable": "true"
// },
// ],
// "coin": "BTC",
// "coinId": "1",
// "transfer": "true""
// }
// ],
// "msg": "success",
// "requestTime": "1700120731773"
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseDepositWithdrawFees(data, codes, "coin")
return nil
}()
return ch
}
/**
* @method
* @name bitget#borrowCrossMargin
* @description create a loan to borrow margin
* @see https://www.bitget.com/api-doc/margin/cross/account/Cross-Borrow
* @param {string} code unified currency code of the currency to borrow
* @param {string} amount the amount to borrow
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
*/
func (this *bitget) BorrowCrossMargin(code interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes78828 := (<-this.LoadMarkets())
PanicOnError(retRes78828)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"borrowAmount": this.CurrencyToPrecision(code, amount),
}
response:= (<-this.PrivateMarginPostV2MarginCrossedAccountBorrow(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700876470931,
// "data": {
// "loanId": "1112122013642272769",
// "coin": "USDT",
// "borrowAmount": "4"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
ch <- this.ParseMarginLoan(data, currency)
return nil
}()
return ch
}
/**
* @method
* @name bitget#borrowIsolatedMargin
* @description create a loan to borrow margin
* @see https://www.bitget.com/api-doc/margin/isolated/account/Isolated-Borrow
* @param {string} symbol unified market symbol
* @param {string} code unified currency code of the currency to borrow
* @param {string} amount the amount to borrow
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
*/
func (this *bitget) BorrowIsolatedMargin(symbol interface{}, code interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes79178 := (<-this.LoadMarkets())
PanicOnError(retRes79178)
var currency interface{} = this.Currency(code)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"borrowAmount": this.CurrencyToPrecision(code, amount),
"symbol": GetValue(market, "id"),
}
response:= (<-this.PrivateMarginPostV2MarginIsolatedAccountBorrow(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700877255605,
// "data": {
// "loanId": "1112125304879067137",
// "symbol": "BTCUSDT",
// "coin": "USDT",
// "borrowAmount": "4"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
ch <- this.ParseMarginLoan(data, currency, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#repayIsolatedMargin
* @description repay borrowed margin and interest
* @see https://www.bitget.com/api-doc/margin/isolated/account/Isolated-Repay
* @param {string} symbol unified market symbol
* @param {string} code unified currency code of the currency to repay
* @param {string} amount the amount to repay
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
*/
func (this *bitget) RepayIsolatedMargin(symbol interface{}, code interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes79558 := (<-this.LoadMarkets())
PanicOnError(retRes79558)
var currency interface{} = this.Currency(code)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"repayAmount": this.CurrencyToPrecision(code, amount),
"symbol": GetValue(market, "id"),
}
response:= (<-this.PrivateMarginPostV2MarginIsolatedAccountRepay(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700877518012,
// "data": {
// "remainDebtAmount": "0",
// "repayId": "1112126405439270912",
// "symbol": "BTCUSDT",
// "coin": "USDT",
// "repayAmount": "8.000137"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
ch <- this.ParseMarginLoan(data, currency, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#repayCrossMargin
* @description repay borrowed margin and interest
* @see https://www.bitget.com/api-doc/margin/cross/account/Cross-Repay
* @param {string} code unified currency code of the currency to repay
* @param {string} amount the amount to repay
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
*/
func (this *bitget) RepayCrossMargin(code interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes79938 := (<-this.LoadMarkets())
PanicOnError(retRes79938)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"repayAmount": this.CurrencyToPrecision(code, amount),
}
response:= (<-this.PrivateMarginPostV2MarginCrossedAccountRepay(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700876704885,
// "data": {
// "remainDebtAmount": "0",
// "repayId": "1112122994945830912",
// "coin": "USDT",
// "repayAmount": "4.00006834"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
ch <- this.ParseMarginLoan(data, currency)
return nil
}()
return ch
}
func (this *bitget) ParseMarginLoan(info interface{}, optionalArgs ...interface{}) interface{} {
//
// isolated: borrowMargin
//
// {
// "loanId": "1112125304879067137",
// "symbol": "BTCUSDT",
// "coin": "USDT",
// "borrowAmount": "4"
// }
//
// cross: borrowMargin
//
// {
// "loanId": "1112122013642272769",
// "coin": "USDT",
// "borrowAmount": "4"
// }
//
// isolated: repayMargin
//
// {
// "remainDebtAmount": "0",
// "repayId": "1112126405439270912",
// "symbol": "BTCUSDT",
// "coin": "USDT",
// "repayAmount": "8.000137"
// }
//
// cross: repayMargin
//
// {
// "remainDebtAmount": "0",
// "repayId": "1112122994945830912",
// "coin": "USDT",
// "repayAmount": "4.00006834"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
market := GetArg(optionalArgs, 1, nil)
_ = market
var currencyId interface{} = this.SafeString(info, "coin")
var marketId interface{} = this.SafeString(info, "symbol")
var symbol interface{} = nil
if IsTrue(!IsEqual(marketId, nil)) {
symbol = this.SafeSymbol(marketId, market, nil, "spot")
}
return map[string]interface{} {
"id": this.SafeString2(info, "loanId", "repayId"),
"currency": this.SafeCurrencyCode(currencyId, currency),
"amount": this.SafeNumber2(info, "borrowAmount", "repayAmount"),
"symbol": symbol,
"timestamp": nil,
"datetime": nil,
"info": info,
}
}
/**
* @method
* @name bitget#fetchMyLiquidations
* @description retrieves the users liquidated positions
* @see https://www.bitget.com/api-doc/margin/cross/record/Get-Cross-Liquidation-Records
* @see https://www.bitget.com/api-doc/margin/isolated/record/Get-Isolated-Liquidation-Records
* @param {string} [symbol] unified CCXT market symbol
* @param {int} [since] the earliest time in ms to fetch liquidations for
* @param {int} [limit] the maximum number of liquidation structures to retrieve
* @param {object} [params] exchange specific parameters for the bitget api endpoint
* @param {int} [params.until] timestamp in ms of the latest liquidation
* @param {string} [params.marginMode] 'cross' or 'isolated' default value is 'cross'
* @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)
* @returns {object} an array of [liquidation structures]{@link https://docs.ccxt.com/#/?id=liquidation-structure}
*/
func (this *bitget) FetchMyLiquidations(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes80888 := (<-this.LoadMarkets())
PanicOnError(retRes80888)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchMyLiquidations", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes809219 := (<-this.FetchPaginatedCallCursor("fetchMyLiquidations", symbol, since, limit, params, "minId", "idLessThan"))
PanicOnError(retRes809219)
ch <- retRes809219
return nil
}
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
}
var typeVar interface{} = nil
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchMyLiquidations", market, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
if IsTrue(!IsEqual(typeVar, "spot")) {
panic(NotSupported(Add(this.Id, " fetchMyLiquidations() supports spot margin markets only")))
}
var request interface{} = map[string]interface{} {}
requestparamsVariable := this.HandleUntilOption("endTime", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
} else {
AddElementToObject(request, "startTime", Subtract(this.Milliseconds(), 7776000000))
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var response interface{} = nil
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchMyLiquidations", params, "cross");
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
if IsTrue(IsEqual(marginMode, "isolated")) {
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchMyLiquidations() requires a symbol argument")))
}
AddElementToObject(request, "symbol", GetValue(market, "id"))
response = (<-this.PrivateMarginGetV2MarginIsolatedLiquidationHistory(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginGetV2MarginCrossedLiquidationHistory(this.Extend(request, params)))
PanicOnError(response)
}
//
// isolated
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1698114119193,
// "data": {
// "resultList": [
// {
// "liqId": "123",
// "symbol": "BTCUSDT",
// "liqStartTime": "1653453245342",
// "liqEndTime": "16312423423432",
// "liqRiskRatio": "1.01",
// "totalAssets": "1242.34",
// "totalDebt": "1100",
// "liqFee": "1.2",
// "uTime": "1668134458717",
// "cTime": "1653453245342"
// }
// ],
// "maxId": "0",
// "minId": "0"
// }
// }
//
// cross
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1698114119193,
// "data": {
// "resultList": [
// {
// "liqId": "123",
// "liqStartTime": "1653453245342",
// "liqEndTime": "16312423423432",
// "liqRiskRatio": "1.01",
// "totalAssets": "1242.34",
// "totalDebt": "1100",
// "LiqFee": "1.2",
// "uTime": "1668134458717",
// "cTime": "1653453245342"
// }
// ],
// "maxId": "0",
// "minId": "0"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var liquidations interface{} = this.SafeList(data, "resultList", []interface{}{})
ch <- this.ParseLiquidations(liquidations, market, since, limit)
return nil
}()
return ch
}
func (this *bitget) ParseLiquidation(liquidation interface{}, optionalArgs ...interface{}) interface{} {
//
// isolated
//
// {
// "liqId": "123",
// "symbol": "BTCUSDT",
// "liqStartTime": "1653453245342",
// "liqEndTime": "16312423423432",
// "liqRiskRatio": "1.01",
// "totalAssets": "1242.34",
// "totalDebt": "1100",
// "liqFee": "1.2",
// "uTime": "1692690126000"
// "cTime": "1653453245342"
// }
//
// cross
//
// {
// "liqId": "123",
// "liqStartTime": "1653453245342",
// "liqEndTime": "16312423423432",
// "liqRiskRatio": "1.01",
// "totalAssets": "1242.34",
// "totalDebt": "1100",
// "LiqFee": "1.2",
// "uTime": "1692690126000"
// "cTime": "1653453245342"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(liquidation, "symbol")
var timestamp interface{} = this.SafeInteger(liquidation, "liqEndTime")
var liquidationFee interface{} = this.SafeString2(liquidation, "LiqFee", "liqFee")
var totalDebt interface{} = this.SafeString(liquidation, "totalDebt")
var quoteValueString interface{} = Precise.StringAdd(liquidationFee, totalDebt)
return this.SafeLiquidation(map[string]interface{} {
"info": liquidation,
"symbol": this.SafeSymbol(marketId, market),
"contracts": nil,
"contractSize": nil,
"price": nil,
"baseValue": nil,
"quoteValue": this.ParseNumber(quoteValueString),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
})
}
/**
* @method
* @name bitget#fetchIsolatedBorrowRate
* @description fetch the rate of interest to borrow a currency for margin trading
* @see https://www.bitget.com/api-doc/margin/isolated/account/Isolated-Margin-Interest-Rate-And-Max-Borrowable-Amount
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an [isolated borrow rate structure]{@link https://docs.ccxt.com/#/?id=isolated-borrow-rate-structure}
*/
func (this *bitget) FetchIsolatedBorrowRate(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes82418 := (<-this.LoadMarkets())
PanicOnError(retRes82418)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
response:= (<-this.PrivateMarginGetV2MarginIsolatedInterestRateAndLimit(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700878692567,
// "data": [
// {
// "symbol": "BTCUSDT",
// "leverage": "10",
// "baseCoin": "BTC",
// "baseTransferable": true,
// "baseBorrowable": true,
// "baseDailyInterestRate": "0.00007",
// "baseAnnuallyInterestRate": "0.02555",
// "baseMaxBorrowableAmount": "27",
// "baseVipList": [
// {"level":"0","dailyInterestRate":"0.00007","limit":"27","annuallyInterestRate":"0.02555","discountRate":"1"},
// {"level":"1","dailyInterestRate":"0.0000679","limit":"27.81","annuallyInterestRate":"0.0247835","discountRate":"0.97"},
// {"level":"2","dailyInterestRate":"0.0000644","limit":"29.16","annuallyInterestRate":"0.023506","discountRate":"0.92"},
// {"level":"3","dailyInterestRate":"0.0000602","limit":"31.32","annuallyInterestRate":"0.021973","discountRate":"0.86"},
// {"level":"4","dailyInterestRate":"0.0000525","limit":"35.91","annuallyInterestRate":"0.0191625","discountRate":"0.75"},
// {"level":"5","dailyInterestRate":"0.000042","limit":"44.82","annuallyInterestRate":"0.01533","discountRate":"0.6"}
// ],
// "quoteCoin": "USDT",
// "quoteTransferable": true,
// "quoteBorrowable": true,
// "quoteDailyInterestRate": "0.00041095",
// "quoteAnnuallyInterestRate": "0.14999675",
// "quoteMaxBorrowableAmount": "300000",
// "quoteList": [
// {"level":"0","dailyInterestRate":"0.00041095","limit":"300000","annuallyInterestRate":"0.14999675","discountRate":"1"},
// {"level":"1","dailyInterestRate":"0.00039863","limit":"309000","annuallyInterestRate":"0.14549995","discountRate":"0.97"},
// {"level":"2","dailyInterestRate":"0.00037808","limit":"324000","annuallyInterestRate":"0.1379992","discountRate":"0.92"},
// {"level":"3","dailyInterestRate":"0.00035342","limit":"348000","annuallyInterestRate":"0.1289983","discountRate":"0.86"},
// {"level":"4","dailyInterestRate":"0.00030822","limit":"399000","annuallyInterestRate":"0.1125003","discountRate":"0.75"},
// {"level":"5","dailyInterestRate":"0.00024657","limit":"498000","annuallyInterestRate":"0.08999805","discountRate":"0.6"}
// ]
// }
// ]
// }
//
var timestamp interface{} = this.SafeInteger(response, "requestTime")
var data interface{} = this.SafeValue(response, "data", []interface{}{})
var first interface{} = this.SafeValue(data, 0, map[string]interface{} {})
AddElementToObject(first, "timestamp", timestamp)
ch <- this.ParseIsolatedBorrowRate(first, market)
return nil
}()
return ch
}
func (this *bitget) ParseIsolatedBorrowRate(info interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "symbol": "BTCUSDT",
// "leverage": "10",
// "baseCoin": "BTC",
// "baseTransferable": true,
// "baseBorrowable": true,
// "baseDailyInterestRate": "0.00007",
// "baseAnnuallyInterestRate": "0.02555",
// "baseMaxBorrowableAmount": "27",
// "baseVipList": [
// {"level":"0","dailyInterestRate":"0.00007","limit":"27","annuallyInterestRate":"0.02555","discountRate":"1"},
// {"level":"1","dailyInterestRate":"0.0000679","limit":"27.81","annuallyInterestRate":"0.0247835","discountRate":"0.97"},
// {"level":"2","dailyInterestRate":"0.0000644","limit":"29.16","annuallyInterestRate":"0.023506","discountRate":"0.92"},
// {"level":"3","dailyInterestRate":"0.0000602","limit":"31.32","annuallyInterestRate":"0.021973","discountRate":"0.86"},
// {"level":"4","dailyInterestRate":"0.0000525","limit":"35.91","annuallyInterestRate":"0.0191625","discountRate":"0.75"},
// {"level":"5","dailyInterestRate":"0.000042","limit":"44.82","annuallyInterestRate":"0.01533","discountRate":"0.6"}
// ],
// "quoteCoin": "USDT",
// "quoteTransferable": true,
// "quoteBorrowable": true,
// "quoteDailyInterestRate": "0.00041095",
// "quoteAnnuallyInterestRate": "0.14999675",
// "quoteMaxBorrowableAmount": "300000",
// "quoteList": [
// {"level":"0","dailyInterestRate":"0.00041095","limit":"300000","annuallyInterestRate":"0.14999675","discountRate":"1"},
// {"level":"1","dailyInterestRate":"0.00039863","limit":"309000","annuallyInterestRate":"0.14549995","discountRate":"0.97"},
// {"level":"2","dailyInterestRate":"0.00037808","limit":"324000","annuallyInterestRate":"0.1379992","discountRate":"0.92"},
// {"level":"3","dailyInterestRate":"0.00035342","limit":"348000","annuallyInterestRate":"0.1289983","discountRate":"0.86"},
// {"level":"4","dailyInterestRate":"0.00030822","limit":"399000","annuallyInterestRate":"0.1125003","discountRate":"0.75"},
// {"level":"5","dailyInterestRate":"0.00024657","limit":"498000","annuallyInterestRate":"0.08999805","discountRate":"0.6"}
// ]
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(info, "symbol")
var symbol interface{} = this.SafeSymbol(marketId, market, nil, "spot")
var baseId interface{} = this.SafeString(info, "baseCoin")
var quoteId interface{} = this.SafeString(info, "quoteCoin")
var timestamp interface{} = this.SafeInteger(info, "timestamp")
return map[string]interface{} {
"symbol": symbol,
"base": this.SafeCurrencyCode(baseId),
"baseRate": this.SafeNumber(info, "baseDailyInterestRate"),
"quote": this.SafeCurrencyCode(quoteId),
"quoteRate": this.SafeNumber(info, "quoteDailyInterestRate"),
"period": 86400000,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"info": info,
}
}
/**
* @method
* @name bitget#fetchCrossBorrowRate
* @description fetch the rate of interest to borrow a currency for margin trading
* @see https://www.bitget.com/api-doc/margin/cross/account/Get-Cross-Margin-Interest-Rate-And-Borrowable
* @param {string} code unified currency code
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.symbol] required for isolated margin
* @returns {object} a [borrow rate structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#borrow-rate-structure}
*/
func (this *bitget) FetchCrossBorrowRate(code interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes83598 := (<-this.LoadMarkets())
PanicOnError(retRes83598)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
}
response:= (<-this.PrivateMarginGetV2MarginCrossedInterestRateAndLimit(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700879047861,
// "data": [
// {
// "coin": "BTC",
// "leverage": "3",
// "transferable": true,
// "borrowable": true,
// "dailyInterestRate": "0.00007",
// "annualInterestRate": "0.02555",
// "maxBorrowableAmount": "26",
// "vipList": [
// {"level":"0","limit":"26","dailyInterestRate":"0.00007","annualInterestRate":"0.02555","discountRate":"1"},
// {"level":"1","limit":"26.78","dailyInterestRate":"0.0000679","annualInterestRate":"0.0247835","discountRate":"0.97"},
// {"level":"2","limit":"28.08","dailyInterestRate":"0.0000644","annualInterestRate":"0.023506","discountRate":"0.92"},
// {"level":"3","limit":"30.16","dailyInterestRate":"0.0000602","annualInterestRate":"0.021973","discountRate":"0.86"},
// {"level":"4","limit":"34.58","dailyInterestRate":"0.0000525","annualInterestRate":"0.0191625","discountRate":"0.75"},
// {"level":"5","limit":"43.16","dailyInterestRate":"0.000042","annualInterestRate":"0.01533","discountRate":"0.6"}
// ]
// }
// ]
// }
//
var timestamp interface{} = this.SafeInteger(response, "requestTime")
var data interface{} = this.SafeValue(response, "data", []interface{}{})
var first interface{} = this.SafeValue(data, 0, map[string]interface{} {})
AddElementToObject(first, "timestamp", timestamp)
ch <- this.ParseBorrowRate(first, currency)
return nil
}()
return ch
}
func (this *bitget) ParseBorrowRate(info interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "coin": "BTC",
// "leverage": "3",
// "transferable": true,
// "borrowable": true,
// "dailyInterestRate": "0.00007",
// "annualInterestRate": "0.02555",
// "maxBorrowableAmount": "26",
// "vipList": [
// {"level":"0","limit":"26","dailyInterestRate":"0.00007","annualInterestRate":"0.02555","discountRate":"1"},
// {"level":"1","limit":"26.78","dailyInterestRate":"0.0000679","annualInterestRate":"0.0247835","discountRate":"0.97"},
// {"level":"2","limit":"28.08","dailyInterestRate":"0.0000644","annualInterestRate":"0.023506","discountRate":"0.92"},
// {"level":"3","limit":"30.16","dailyInterestRate":"0.0000602","annualInterestRate":"0.021973","discountRate":"0.86"},
// {"level":"4","limit":"34.58","dailyInterestRate":"0.0000525","annualInterestRate":"0.0191625","discountRate":"0.75"},
// {"level":"5","limit":"43.16","dailyInterestRate":"0.000042","annualInterestRate":"0.01533","discountRate":"0.6"}
// ]
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var currencyId interface{} = this.SafeString(info, "coin")
var timestamp interface{} = this.SafeInteger(info, "timestamp")
return map[string]interface{} {
"currency": this.SafeCurrencyCode(currencyId, currency),
"rate": this.SafeNumber(info, "dailyInterestRate"),
"period": 86400000,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"info": info,
}
}
/**
* @method
* @name bitget#fetchBorrowInterest
* @description fetch the interest owed by the user for borrowing currency for margin trading
* @see https://www.bitget.com/api-doc/margin/cross/record/Get-Cross-Interest-Records
* @see https://www.bitget.com/api-doc/margin/isolated/record/Get-Isolated-Interest-Records
* @param {string} [code] unified currency code
* @param {string} [symbol] unified market symbol when fetching interest in isolated markets
* @param {int} [since] the earliest time in ms to fetch borrow interest for
* @param {int} [limit] the maximum number of structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @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)
* @returns {object[]} a list of [borrow interest structures]{@link https://docs.ccxt.com/#/?id=borrow-interest-structure}
*/
func (this *bitget) FetchBorrowInterest(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
code := GetArg(optionalArgs, 0, nil)
_ = code
symbol := GetArg(optionalArgs, 1, nil)
_ = symbol
since := GetArg(optionalArgs, 2, nil)
_ = since
limit := GetArg(optionalArgs, 3, nil)
_ = limit
params := GetArg(optionalArgs, 4, map[string]interface{} {})
_ = params
retRes84458 := (<-this.LoadMarkets())
PanicOnError(retRes84458)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchBorrowInterest", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes844919 := (<-this.FetchPaginatedCallCursor("fetchBorrowInterest", symbol, since, limit, params, "minId", "idLessThan"))
PanicOnError(retRes844919)
ch <- retRes844919
return nil
}
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {}
var currency interface{} = nil
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "coin", GetValue(currency, "id"))
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
} else {
AddElementToObject(request, "startTime", Subtract(this.Milliseconds(), 7776000000))
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var response interface{} = nil
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("fetchBorrowInterest", params, "cross");
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
if IsTrue(IsEqual(marginMode, "isolated")) {
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchBorrowInterest() requires a symbol argument")))
}
AddElementToObject(request, "symbol", GetValue(market, "id"))
response = (<-this.PrivateMarginGetV2MarginIsolatedInterestHistory(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginGetV2MarginCrossedInterestHistory(this.Extend(request, params)))
PanicOnError(response)
}
//
// isolated
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700879935189,
// "data": {
// "resultList": [
// {
// "interestId": "1112125304879067137",
// "interestCoin": "USDT",
// "dailyInterestRate": "0.00041095",
// "loanCoin": "USDT",
// "interestAmount": "0.0000685",
// "interstType": "first",
// "symbol": "BTCUSDT",
// "cTime": "1700877255648",
// "uTime": "1700877255648"
// },
// ],
// "maxId": "1112125304879067137",
// "minId": "1100138015672119298"
// }
// }
//
// cross
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1700879597044,
// "data": {
// "resultList": [
// {
// "interestId": "1112122013642272769",
// "interestCoin": "USDT",
// "dailyInterestRate": "0.00041",
// "loanCoin": "USDT",
// "interestAmount": "0.00006834",
// "interstType": "first",
// "cTime": "1700876470957",
// "uTime": "1700876470957"
// },
// ],
// "maxId": "1112122013642272769",
// "minId": "1096917004629716993"
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var rows interface{} = this.SafeValue(data, "resultList", []interface{}{})
var interest interface{} = this.ParseBorrowInterests(rows, market)
ch <- this.FilterByCurrencySinceLimit(interest, code, since, limit)
return nil
}()
return ch
}
func (this *bitget) ParseBorrowInterest(info interface{}, optionalArgs ...interface{}) interface{} {
//
// isolated
//
// {
// "interestId": "1112125304879067137",
// "interestCoin": "USDT",
// "dailyInterestRate": "0.00041095",
// "loanCoin": "USDT",
// "interestAmount": "0.0000685",
// "interstType": "first",
// "symbol": "BTCUSDT",
// "cTime": "1700877255648",
// "uTime": "1700877255648"
// }
//
// cross
//
// {
// "interestId": "1112122013642272769",
// "interestCoin": "USDT",
// "dailyInterestRate": "0.00041",
// "loanCoin": "USDT",
// "interestAmount": "0.00006834",
// "interstType": "first",
// "cTime": "1700876470957",
// "uTime": "1700876470957"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(info, "symbol")
market = this.SafeMarket(marketId, market)
var marginMode interface{} = Ternary(IsTrue((!IsEqual(marketId, nil))), "isolated", "cross")
var timestamp interface{} = this.SafeInteger(info, "cTime")
return map[string]interface{} {
"info": info,
"symbol": this.SafeString(market, "symbol"),
"currency": this.SafeCurrencyCode(this.SafeString(info, "interestCoin")),
"interest": this.SafeNumber(info, "interestAmount"),
"interestRate": this.SafeNumber(info, "dailyInterestRate"),
"amountBorrowed": nil,
"marginMode": marginMode,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
}
}
/**
* @method
* @name bitget#closePosition
* @description closes an open position for a market
* @see https://www.bitget.com/api-doc/contract/trade/Flash-Close-Position
* @param {string} symbol unified CCXT market symbol
* @param {string} [side] one-way mode: 'buy' or 'sell', hedge-mode: 'long' or 'short'
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *bitget) ClosePosition(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
side := GetArg(optionalArgs, 0, nil)
_ = side
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes85948 := (<-this.LoadMarkets())
PanicOnError(retRes85948)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"productType": productType,
}
if IsTrue(!IsEqual(side, nil)) {
AddElementToObject(request, "holdSide", side)
}
response:= (<-this.PrivateMixPostV2MixOrderClosePositions(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1702975017017,
// "data": {
// "successList": [
// {
// "orderId": "1120923953904893955",
// "clientOid": "1120923953904893956"
// }
// ],
// "failureList": [],
// "result": false
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var order interface{} = this.SafeList(data, "successList", []interface{}{})
ch <- this.ParseOrder(GetValue(order, 0), market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#closeAllPositions
* @description closes all open positions for a market type
* @see https://www.bitget.com/api-doc/contract/trade/Flash-Close-Position
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.productType] 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
* @returns {object[]} A list of [position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *bitget) CloseAllPositions(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes86458 := (<-this.LoadMarkets())
PanicOnError(retRes86458)
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(nil, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"productType": productType,
}
response:= (<-this.PrivateMixPostV2MixOrderClosePositions(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1702975017017,
// "data": {
// "successList": [
// {
// "orderId": "1120923953904893955",
// "clientOid": "1120923953904893956"
// }
// ],
// "failureList": [],
// "result": false
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var orderInfo interface{} = this.SafeList(data, "successList", []interface{}{})
ch <- this.ParsePositions(orderInfo, nil, params)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchMarginMode
* @description fetches the margin mode of a trading pair
* @see https://www.bitget.com/api-doc/contract/account/Get-Single-Account
* @param {string} symbol unified symbol of the market to fetch the margin mode for
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [margin mode structure]{@link https://docs.ccxt.com/#/?id=margin-mode-structure}
*/
func (this *bitget) FetchMarginMode(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes86848 := (<-this.LoadMarkets())
PanicOnError(retRes86848)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"marginCoin": GetValue(market, "settleId"),
"productType": productType,
}
response:= (<-this.PrivateMixGetV2MixAccountAccount(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1709791216652,
// "data": {
// "marginCoin": "USDT",
// "locked": "0",
// "available": "19.88811074",
// "crossedMaxAvailable": "19.88811074",
// "isolatedMaxAvailable": "19.88811074",
// "maxTransferOut": "19.88811074",
// "accountEquity": "19.88811074",
// "usdtEquity": "19.888110749166",
// "btcEquity": "0.000302183391",
// "crossedRiskRate": "0",
// "crossedMarginLeverage": 20,
// "isolatedLongLever": 20,
// "isolatedShortLever": 20,
// "marginMode": "crossed",
// "posMode": "hedge_mode",
// "unrealizedPL": "0",
// "coupon": "0",
// "crossedUnrealizedPL": "0",
// "isolatedUnrealizedPL": ""
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
ch <- this.ParseMarginMode(data, market)
return nil
}()
return ch
}
func (this *bitget) ParseMarginMode(marginMode interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var marginType interface{} = this.SafeString(marginMode, "marginMode")
marginType = Ternary(IsTrue((IsEqual(marginType, "crossed"))), "cross", marginType)
return map[string]interface{} {
"info": marginMode,
"symbol": GetValue(market, "symbol"),
"marginMode": marginType,
}
}
/**
* @method
* @name bitget#fetchPositionsHistory
* @description fetches historical positions
* @see https://www.bitget.com/api-doc/contract/position/Get-History-Position
* @param {string[]} [symbols] unified contract symbols
* @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
* @param {int} [limit] the maximum amount of records to fetch, default=20, max=100
* @param {object} params extra parameters specific to the exchange api endpoint
* @param {int} [params.until] timestamp in ms of the latest position to fetch, max range for params["until"] - since is 3 months
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {string} [params.productType] USDT-FUTURES (default), COIN-FUTURES, USDC-FUTURES, SUSDT-FUTURES, SCOIN-FUTURES, or SUSDC-FUTURES
* @returns {object[]} a list of [position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *bitget) FetchPositionsHistory(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbols := GetArg(optionalArgs, 0, nil)
_ = symbols
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes87598 := (<-this.LoadMarkets())
PanicOnError(retRes87598)
var until interface{} = this.SafeInteger(params, "until")
params = this.Omit(params, "until")
var request interface{} = map[string]interface{} {}
if IsTrue(!IsEqual(symbols, nil)) {
var symbolsLength interface{} = GetArrayLength(symbols)
if IsTrue(IsGreaterThan(symbolsLength, 0)) {
var market interface{} = this.Market(GetValue(symbols, 0))
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(!IsEqual(until, nil)) {
AddElementToObject(request, "endTime", until)
}
response:= (<-this.PrivateMixGetV2MixPositionHistoryPosition(this.Extend(request, params)))
PanicOnError(response)
//
// {
// code: '00000',
// msg: 'success',
// requestTime: '1712794148791',
// data: {
// list: [
// {
// symbol: 'XRPUSDT',
// marginCoin: 'USDT',
// holdSide: 'long',
// openAvgPrice: '0.64967',
// closeAvgPrice: '0.58799',
// marginMode: 'isolated',
// openTotalPos: '10',
// closeTotalPos: '10',
// pnl: '-0.62976205',
// netProfit: '-0.65356802',
// totalFunding: '-0.01638',
// openFee: '-0.00389802',
// closeFee: '-0.00352794',
// ctime: '1709590322199',
// utime: '1709667583395'
// },
// ...
// ]
// }
// }
//
var data interface{} = this.SafeDict(response, "data")
var responseList interface{} = this.SafeList(data, "list")
var positions interface{} = this.ParsePositions(responseList, symbols, params)
ch <- this.FilterBySinceLimit(positions, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchConvertQuote
* @description fetch a quote for converting from one currency to another
* @see https://www.bitget.com/api-doc/common/convert/Get-Quoted-Price
* @param {string} fromCode the currency that you want to sell and convert from
* @param {string} toCode the currency that you want to buy and convert into
* @param {float} [amount] how much you want to trade in units of the from currency
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [conversion structure]{@link https://docs.ccxt.com/#/?id=conversion-structure}
*/
func (this *bitget) FetchConvertQuote(fromCode interface{}, toCode interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
amount := GetArg(optionalArgs, 0, nil)
_ = amount
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes88278 := (<-this.LoadMarkets())
PanicOnError(retRes88278)
var request interface{} = map[string]interface{} {
"fromCoin": fromCode,
"toCoin": toCode,
"fromCoinSize": this.NumberToString(amount),
}
response:= (<-this.PrivateConvertGetV2ConvertQuotedPrice(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1712121940158,
// "data": {
// "fromCoin": "USDT",
// "fromCoinSize": "5",
// "cnvtPrice": "0.9993007892377704",
// "toCoin": "USDC",
// "toCoinSize": "4.99650394",
// "traceId": "1159288930228187140",
// "fee": "0"
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
var fromCurrencyId interface{} = this.SafeString(data, "fromCoin", fromCode)
var fromCurrency interface{} = this.Currency(fromCurrencyId)
var toCurrencyId interface{} = this.SafeString(data, "toCoin", toCode)
var toCurrency interface{} = this.Currency(toCurrencyId)
ch <- this.ParseConversion(data, fromCurrency, toCurrency)
return nil
}()
return ch
}
/**
* @method
* @name bitget#createConvertTrade
* @description convert from one currency to another
* @see https://www.bitget.com/api-doc/common/convert/Trade
* @param {string} id the id of the trade that you want to make
* @param {string} fromCode the currency that you want to sell and convert from
* @param {string} toCode the currency that you want to buy and convert into
* @param {float} amount how much you want to trade in units of the from currency
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} params.price the price of the conversion, obtained from fetchConvertQuote()
* @param {string} params.toAmount the amount you want to trade in units of the toCurrency, obtained from fetchConvertQuote()
* @returns {object} a [conversion structure]{@link https://docs.ccxt.com/#/?id=conversion-structure}
*/
func (this *bitget) CreateConvertTrade(id interface{}, fromCode interface{}, toCode interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
amount := GetArg(optionalArgs, 0, nil)
_ = amount
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes88738 := (<-this.LoadMarkets())
PanicOnError(retRes88738)
var price interface{} = this.SafeString2(params, "price", "cnvtPrice")
if IsTrue(IsEqual(price, nil)) {
panic(ArgumentsRequired(Add(this.Id, " createConvertTrade() requires a price parameter")))
}
var toAmount interface{} = this.SafeString2(params, "toAmount", "toCoinSize")
if IsTrue(IsEqual(toAmount, nil)) {
panic(ArgumentsRequired(Add(this.Id, " createConvertTrade() requires a toAmount parameter")))
}
params = this.Omit(params, []interface{}{"price", "toAmount"})
var request interface{} = map[string]interface{} {
"traceId": id,
"fromCoin": fromCode,
"toCoin": toCode,
"fromCoinSize": this.NumberToString(amount),
"toCoinSize": toAmount,
"cnvtPrice": price,
}
response:= (<-this.PrivateConvertPostV2ConvertTrade(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1712123746203,
// "data": {
// "cnvtPrice": "0.99940076",
// "toCoin": "USDC",
// "toCoinSize": "4.99700379",
// "ts": "1712123746217"
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
var toCurrencyId interface{} = this.SafeString(data, "toCoin", toCode)
var toCurrency interface{} = this.Currency(toCurrencyId)
ch <- this.ParseConversion(data, nil, toCurrency)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchConvertTradeHistory
* @description fetch the users history of conversion trades
* @see https://www.bitget.com/api-doc/common/convert/Get-Convert-Record
* @param {string} [code] the unified currency code
* @param {int} [since] the earliest time in ms to fetch conversions for
* @param {int} [limit] the maximum number of conversion structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} a list of [conversion structures]{@link https://docs.ccxt.com/#/?id=conversion-structure}
*/
func (this *bitget) FetchConvertTradeHistory(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
code := GetArg(optionalArgs, 0, nil)
_ = code
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes89238 := (<-this.LoadMarkets())
PanicOnError(retRes89238)
var request interface{} = map[string]interface{} {}
var msInDay interface{} = 86400000
var now interface{} = this.Milliseconds()
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
} else {
AddElementToObject(request, "startTime", Subtract(now, msInDay))
}
var endTime interface{} = this.SafeString2(params, "endTime", "until")
if IsTrue(!IsEqual(endTime, nil)) {
AddElementToObject(request, "endTime", endTime)
} else {
AddElementToObject(request, "endTime", now)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
params = this.Omit(params, "until")
response:= (<-this.PrivateConvertGetV2ConvertConvertRecord(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1712124371799,
// "data": {
// "dataList": [
// {
// "id": "1159296505255219205",
// "fromCoin": "USDT",
// "fromCoinSize": "5",
// "cnvtPrice": "0.99940076",
// "toCoin": "USDC",
// "toCoinSize": "4.99700379",
// "ts": "1712123746217",
// "fee": "0"
// }
// ],
// "endId": "1159296505255219205"
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
var dataList interface{} = this.SafeList(data, "dataList", []interface{}{})
ch <- this.ParseConversions(dataList, code, "fromCoin", "toCoin", since, limit)
return nil
}()
return ch
}
func (this *bitget) ParseConversion(conversion interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchConvertQuote
//
// {
// "fromCoin": "USDT",
// "fromCoinSize": "5",
// "cnvtPrice": "0.9993007892377704",
// "toCoin": "USDC",
// "toCoinSize": "4.99650394",
// "traceId": "1159288930228187140",
// "fee": "0"
// }
//
// createConvertTrade
//
// {
// "cnvtPrice": "0.99940076",
// "toCoin": "USDC",
// "toCoinSize": "4.99700379",
// "ts": "1712123746217"
// }
//
// fetchConvertTradeHistory
//
// {
// "id": "1159296505255219205",
// "fromCoin": "USDT",
// "fromCoinSize": "5",
// "cnvtPrice": "0.99940076",
// "toCoin": "USDC",
// "toCoinSize": "4.99700379",
// "ts": "1712123746217",
// "fee": "0"
// }
//
fromCurrency := GetArg(optionalArgs, 0, nil)
_ = fromCurrency
toCurrency := GetArg(optionalArgs, 1, nil)
_ = toCurrency
var timestamp interface{} = this.SafeInteger(conversion, "ts")
var fromCoin interface{} = this.SafeString(conversion, "fromCoin")
var fromCode interface{} = this.SafeCurrencyCode(fromCoin, fromCurrency)
var to interface{} = this.SafeString(conversion, "toCoin")
var toCode interface{} = this.SafeCurrencyCode(to, toCurrency)
return map[string]interface{} {
"info": conversion,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"id": this.SafeString2(conversion, "id", "traceId"),
"fromCurrency": fromCode,
"fromAmount": this.SafeNumber(conversion, "fromCoinSize"),
"toCurrency": toCode,
"toAmount": this.SafeNumber(conversion, "toCoinSize"),
"price": this.SafeNumber(conversion, "cnvtPrice"),
"fee": this.SafeNumber(conversion, "fee"),
}
}
/**
* @method
* @name bitget#fetchConvertCurrencies
* @description fetches all available currencies that can be converted
* @see https://www.bitget.com/api-doc/common/convert/Get-Convert-Currencies
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an associative dictionary of currencies
*/
func (this *bitget) FetchConvertCurrencies(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes90348 := (<-this.LoadMarkets())
PanicOnError(retRes90348)
response:= (<-this.PrivateConvertGetV2ConvertCurrencies(params))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1712121755897,
// "data": [
// {
// "coin": "BTC",
// "available": "0.00009850",
// "maxAmount": "0.756266",
// "minAmount": "0.00001"
// },
// ]
// }
//
var result interface{} = map[string]interface{} {}
var data interface{} = this.SafeList(response, "data", []interface{}{})
for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
var entry interface{} = GetValue(data, i)
var id interface{} = this.SafeString(entry, "coin")
var code interface{} = this.SafeCurrencyCode(id)
AddElementToObject(result, code, map[string]interface{} {
"info": entry,
"id": id,
"code": code,
"networks": nil,
"type": nil,
"name": nil,
"active": nil,
"deposit": nil,
"withdraw": this.SafeNumber(entry, "available"),
"fee": nil,
"precision": nil,
"limits": map[string]interface{} {
"amount": map[string]interface{} {
"min": this.SafeNumber(entry, "minAmount"),
"max": this.SafeNumber(entry, "maxAmount"),
},
"withdraw": map[string]interface{} {
"min": nil,
"max": nil,
},
"deposit": map[string]interface{} {
"min": nil,
"max": nil,
},
},
"created": nil,
})
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchFundingInterval
* @description fetch the current funding rate interval
* @see https://www.bitget.com/api-doc/contract/market/Get-Symbol-Next-Funding-Time
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
*/
func (this *bitget) FetchFundingInterval(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes90998 := (<-this.LoadMarkets())
PanicOnError(retRes90998)
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var market interface{} = nil
if IsTrue(sandboxMode) {
var sandboxSymbol interface{} = this.ConvertSymbolForSandbox(symbol)
market = this.Market(sandboxSymbol)
} else {
market = this.Market(symbol)
}
var productType interface{} = nil
productTypeparamsVariable := this.HandleProductTypeAndParams(market, params);
productType = GetValue(productTypeparamsVariable,0);
params = GetValue(productTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"productType": productType,
}
response:= (<-this.PublicMixGetV2MixMarketFundingTime(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "code": "00000",
// "msg": "success",
// "requestTime": 1727930153888,
// "data": [
// {
// "symbol": "BTCUSDT",
// "nextFundingTime": "1727942400000",
// "ratePeriod": "8"
// }
// ]
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
var first interface{} = this.SafeDict(data, 0, map[string]interface{} {})
ch <- this.ParseFundingRate(first, market)
return nil
}()
return ch
}
/**
* @method
* @name bitget#fetchLongShortRatioHistory
* @description fetches the long short ratio history for a unified market symbol
* @see https://www.bitget.com/api-doc/common/apidata/Margin-Ls-Ratio
* @see https://www.bitget.com/api-doc/common/apidata/Account-Long-Short
* @param {string} symbol unified symbol of the market to fetch the long short ratio for
* @param {string} [timeframe] the period for the ratio
* @param {int} [since] the earliest time in ms to fetch ratios for
* @param {int} [limit] the maximum number of long short ratio structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} an array of [long short ratio structures]{@link https://docs.ccxt.com/#/?id=long-short-ratio-structure}
*/
func (this *bitget) FetchLongShortRatioHistory(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
timeframe := GetArg(optionalArgs, 1, nil)
_ = timeframe
since := GetArg(optionalArgs, 2, nil)
_ = since
limit := GetArg(optionalArgs, 3, nil)
_ = limit
params := GetArg(optionalArgs, 4, map[string]interface{} {})
_ = params
retRes91488 := (<-this.LoadMarkets())
PanicOnError(retRes91488)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
if IsTrue(!IsEqual(timeframe, nil)) {
AddElementToObject(request, "period", timeframe)
}
var response interface{} = nil
if IsTrue(IsTrue(GetValue(market, "swap")) || IsTrue(GetValue(market, "future"))) {
response = (<-this.PublicMixGetV2MixMarketAccountLongShort(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PublicMarginGetV2MarginMarketLongShortRatio(this.Extend(request, params)))
PanicOnError(response)
}
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseLongShortRatioHistory(data, market)
return nil
}()
return ch
}
func (this *bitget) ParseLongShortRatio(info interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(info, "symbol")
var timestamp interface{} = this.SafeIntegerOmitZero(info, "ts")
return map[string]interface{} {
"info": info,
"symbol": this.SafeSymbol(marketId, market, nil, "contract"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"timeframe": nil,
"longShortRatio": this.SafeNumber2(info, "longShortRatio", "longShortAccountRatio"),
}
}
func (this *bitget) HandleErrors(code interface{}, reason interface{}, url interface{}, method interface{}, headers interface{}, body interface{}, response interface{}, requestHeaders interface{}, requestBody interface{}) interface{} {
if !IsTrue(response) {
return nil // fallback to default error handler
}
//
// spot
//
// {"code":"00000","msg":"success","requestTime":1713294492511,"data":[...]}"
//
// {"status":"fail","err_code":"01001","err_msg":"系统异常,请稍后重试"}
// {"status":"error","ts":1595594160149,"err_code":"invalid-parameter","err_msg":"invalid size, valid range: [1,2000]"}
// {"status":"error","ts":1595684716042,"err_code":"invalid-parameter","err_msg":"illegal sign invalid"}
// {"status":"error","ts":1595700216275,"err_code":"bad-request","err_msg":"your balance is low!"}
// {"status":"error","ts":1595700344504,"err_code":"invalid-parameter","err_msg":"invalid type"}
// {"status":"error","ts":1595703343035,"err_code":"bad-request","err_msg":"order cancel fail"}
// {"status":"error","ts":1595704360508,"err_code":"invalid-parameter","err_msg":"accesskey not null"}
// {"status":"error","ts":1595704490084,"err_code":"invalid-parameter","err_msg":"permissions not right"}
// {"status":"error","ts":1595711862763,"err_code":"system exception","err_msg":"system exception"}
// {"status":"error","ts":1595730308979,"err_code":"bad-request","err_msg":"20003"}
//
// swap
//
// {"code":"40015","msg":"","requestTime":1595698564931,"data":null}
// {"code":"40017","msg":"Order id must not be blank","requestTime":1595702477835,"data":null}
// {"code":"40017","msg":"Order Type must not be blank","requestTime":1595698516162,"data":null}
// {"code":"40301","msg":"","requestTime":1595667662503,"data":null}
// {"code":"40017","msg":"Contract code must not be blank","requestTime":1595703151651,"data":null}
// {"code":"40108","msg":"","requestTime":1595885064600,"data":null}
// {"order_id":"513468410013679613","client_oid":null,"symbol":"ethusd","result":false,"err_code":"order_no_exist_error","err_msg":"订单不存在!"}
//
var message interface{} = this.SafeString2(response, "err_msg", "msg")
var feedback interface{} = Add(Add(this.Id, " "), body)
var nonEmptyMessage interface{} = (IsTrue(IsTrue((!IsEqual(message, nil))) && IsTrue((!IsEqual(message, "")))) && IsTrue((!IsEqual(message, "success"))))
if IsTrue(nonEmptyMessage) {
this.ThrowExactlyMatchedException(GetValue(this.Exceptions, "exact"), message, feedback)
this.ThrowBroadlyMatchedException(GetValue(this.Exceptions, "broad"), message, feedback)
}
var errorCode interface{} = this.SafeString2(response, "code", "err_code")
var nonZeroErrorCode interface{} = IsTrue((!IsEqual(errorCode, nil))) && IsTrue((!IsEqual(errorCode, "00000")))
if IsTrue(nonZeroErrorCode) {
this.ThrowExactlyMatchedException(GetValue(this.Exceptions, "exact"), errorCode, feedback)
}
if IsTrue(IsTrue(nonZeroErrorCode) || IsTrue(nonEmptyMessage)) {
panic(ExchangeError(feedback))
}
return nil
}
func (this *bitget) Nonce() interface{} {
return Subtract(this.Milliseconds(), GetValue(this.Options, "timeDifference"))
}
func (this *bitget) Sign(path interface{}, optionalArgs ...interface{}) interface{} {
api := GetArg(optionalArgs, 0, []interface{}{})
_ = api
method := GetArg(optionalArgs, 1, "GET")
_ = method
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
headers := GetArg(optionalArgs, 3, nil)
_ = headers
body := GetArg(optionalArgs, 4, nil)
_ = body
var signed interface{} = IsEqual(GetValue(api, 0), "private")
var endpoint interface{} = GetValue(api, 1)
var pathPart interface{} = "/api"
var request interface{} = Add("/", this.ImplodeParams(path, params))
var payload interface{} = Add(pathPart, request)
var url interface{} = Add(this.ImplodeHostname(GetValue(GetValue(this.Urls, "api"), endpoint)), payload)
var query interface{} = this.Omit(params, this.ExtractParams(path))
if IsTrue(!IsTrue(signed) && IsTrue((IsEqual(method, "GET")))) {
var keys interface{} = ObjectKeys(query)
var keysLength interface{} = GetArrayLength(keys)
if IsTrue(IsGreaterThan(keysLength, 0)) {
url = Add(Add(url, "?"), this.Urlencode(query))
}
}
if IsTrue(signed) {
this.CheckRequiredCredentials()
var timestamp interface{} = ToString(this.Nonce())
var auth interface{} = Add(Add(timestamp, method), payload)
if IsTrue(IsEqual(method, "POST")) {
body = this.Json(params)
auth = Add(auth, body)
} else {
if IsTrue(GetArrayLength(ObjectKeys(params))) {
var queryInner interface{} = Add("?", this.Urlencode(this.Keysort(params)))
// check #21169 pr
if IsTrue(IsGreaterThan(GetIndexOf(queryInner, "%24"), OpNeg(1))) {
queryInner = Replace(queryInner, "%24", "$")
}
url = Add(url, queryInner)
auth = Add(auth, queryInner)
}
}
var signature interface{} = this.Hmac(this.Encode(auth), this.Encode(this.Secret), sha256, "base64")
var broker interface{} = this.SafeString(this.Options, "broker")
headers = map[string]interface{} {
"ACCESS-KEY": this.ApiKey,
"ACCESS-SIGN": signature,
"ACCESS-TIMESTAMP": timestamp,
"ACCESS-PASSPHRASE": this.Password,
"X-CHANNEL-API-CODE": broker,
}
if IsTrue(IsEqual(method, "POST")) {
AddElementToObject(headers, "Content-Type", "application/json")
}
}
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
if IsTrue(IsTrue(sandboxMode) && IsTrue((!IsEqual(path, "v2/public/time")))) {
// https://github.com/ccxt/ccxt/issues/25252#issuecomment-2662742336
if IsTrue(IsEqual(headers, nil)) {
headers = map[string]interface{} {}
}
AddElementToObject(headers, "PAPTRADING", "1")
}
return map[string]interface{} {
"url": url,
"method": method,
"body": body,
"headers": headers,
}
}
func (this *bitget) Init(userConfig map[string]interface{}) {
this.Exchange = Exchange{}
this.Exchange.InitParent(userConfig, this.Describe().(map[string]interface{}), this)
this.Exchange.DerivedExchange = this
}