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

9578 lines
430 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 gate struct {
Exchange
}
func NewGateCore() gate {
p := gate{}
setDefaults(&p)
return p
}
func (this *gate) Describe() interface{} {
return this.DeepExtend(this.Exchange.Describe(), map[string]interface{} {
"id": "gate",
"name": "Gate.io",
"countries": []interface{}{"KR"},
"rateLimit": 50,
"version": "v4",
"certified": true,
"pro": true,
"urls": map[string]interface{} {
"logo": "https://github.com/user-attachments/assets/64f988c5-07b6-4652-b5c1-679a6bf67c85",
"doc": "https://www.gate.io/docs/developers/apiv4/en/",
"www": "https://gate.io/",
"api": map[string]interface{} {
"public": map[string]interface{} {
"wallet": "https://api.gateio.ws/api/v4",
"futures": "https://api.gateio.ws/api/v4",
"margin": "https://api.gateio.ws/api/v4",
"delivery": "https://api.gateio.ws/api/v4",
"spot": "https://api.gateio.ws/api/v4",
"options": "https://api.gateio.ws/api/v4",
"sub_accounts": "https://api.gateio.ws/api/v4",
"earn": "https://api.gateio.ws/api/v4",
},
"private": map[string]interface{} {
"withdrawals": "https://api.gateio.ws/api/v4",
"wallet": "https://api.gateio.ws/api/v4",
"futures": "https://api.gateio.ws/api/v4",
"margin": "https://api.gateio.ws/api/v4",
"delivery": "https://api.gateio.ws/api/v4",
"spot": "https://api.gateio.ws/api/v4",
"options": "https://api.gateio.ws/api/v4",
"subAccounts": "https://api.gateio.ws/api/v4",
"unified": "https://api.gateio.ws/api/v4",
"rebate": "https://api.gateio.ws/api/v4",
"earn": "https://api.gateio.ws/api/v4",
"account": "https://api.gateio.ws/api/v4",
"loan": "https://api.gateio.ws/api/v4",
},
},
"test": map[string]interface{} {
"public": map[string]interface{} {
"futures": "https://fx-api-testnet.gateio.ws/api/v4",
"delivery": "https://fx-api-testnet.gateio.ws/api/v4",
"options": "https://fx-api-testnet.gateio.ws/api/v4",
},
"private": map[string]interface{} {
"futures": "https://fx-api-testnet.gateio.ws/api/v4",
"delivery": "https://fx-api-testnet.gateio.ws/api/v4",
"options": "https://fx-api-testnet.gateio.ws/api/v4",
},
},
"referral": map[string]interface{} {
"url": "https://www.gate.io/signup/2436035",
"discount": 0.2,
},
},
"has": map[string]interface{} {
"CORS": nil,
"spot": true,
"margin": true,
"swap": true,
"future": true,
"option": true,
"addMargin": true,
"borrowCrossMargin": true,
"borrowIsolatedMargin": true,
"cancelAllOrders": true,
"cancelOrder": true,
"cancelOrders": true,
"cancelOrdersForSymbols": true,
"createMarketBuyOrderWithCost": true,
"createMarketOrder": true,
"createMarketOrderWithCost": false,
"createMarketSellOrderWithCost": false,
"createOrder": true,
"createOrders": true,
"createPostOnlyOrder": true,
"createReduceOnlyOrder": true,
"createStopLimitOrder": true,
"createStopLossOrder": true,
"createStopMarketOrder": false,
"createStopOrder": true,
"createTakeProfitOrder": true,
"createTriggerOrder": true,
"editOrder": true,
"fetchBalance": true,
"fetchBorrowInterest": true,
"fetchBorrowRateHistories": false,
"fetchBorrowRateHistory": false,
"fetchClosedOrders": true,
"fetchCrossBorrowRate": false,
"fetchCrossBorrowRates": false,
"fetchCurrencies": true,
"fetchDepositAddress": true,
"fetchDepositAddresses": false,
"fetchDepositAddressesByNetwork": false,
"fetchDeposits": true,
"fetchDepositWithdrawFee": "emulated",
"fetchDepositWithdrawFees": true,
"fetchFundingHistory": true,
"fetchFundingRate": true,
"fetchFundingRateHistory": true,
"fetchFundingRates": true,
"fetchGreeks": true,
"fetchIndexOHLCV": true,
"fetchIsolatedBorrowRate": false,
"fetchIsolatedBorrowRates": false,
"fetchLedger": true,
"fetchLeverage": true,
"fetchLeverages": true,
"fetchLeverageTiers": true,
"fetchLiquidations": true,
"fetchMarginAdjustmentHistory": false,
"fetchMarginMode": false,
"fetchMarketLeverageTiers": true,
"fetchMarkets": true,
"fetchMarkOHLCV": true,
"fetchMyLiquidations": true,
"fetchMySettlementHistory": true,
"fetchMyTrades": true,
"fetchNetworkDepositAddress": true,
"fetchOHLCV": true,
"fetchOpenInterest": false,
"fetchOpenInterestHistory": true,
"fetchOpenOrders": true,
"fetchOption": true,
"fetchOptionChain": true,
"fetchOrder": true,
"fetchOrderBook": true,
"fetchPosition": true,
"fetchPositionHistory": "emulated",
"fetchPositionMode": false,
"fetchPositions": true,
"fetchPositionsHistory": true,
"fetchPremiumIndexOHLCV": false,
"fetchSettlementHistory": true,
"fetchTicker": true,
"fetchTickers": true,
"fetchTime": true,
"fetchTrades": true,
"fetchTradingFee": true,
"fetchTradingFees": true,
"fetchTransactionFees": true,
"fetchUnderlyingAssets": true,
"fetchVolatilityHistory": false,
"fetchWithdrawals": true,
"reduceMargin": true,
"repayCrossMargin": true,
"repayIsolatedMargin": true,
"sandbox": true,
"setLeverage": true,
"setMarginMode": false,
"setPositionMode": true,
"signIn": false,
"transfer": true,
"withdraw": true,
},
"api": map[string]interface{} {
"public": map[string]interface{} {
"wallet": map[string]interface{} {
"get": map[string]interface{} {
"currency_chains": 1,
},
},
"spot": map[string]interface{} {
"get": map[string]interface{} {
"currencies": 1,
"currencies/{currency}": 1,
"currency_pairs": 1,
"currency_pairs/{currency_pair}": 1,
"tickers": 1,
"order_book": 1,
"trades": 1,
"candlesticks": 1,
"time": 1,
},
},
"margin": map[string]interface{} {
"get": map[string]interface{} {
"currency_pairs": 1,
"currency_pairs/{currency_pair}": 1,
"funding_book": 1,
"cross/currencies": 1,
"cross/currencies/{currency}": 1,
"uni/currency_pairs": 1,
"uni/currency_pairs/{currency_pair}": 1,
},
},
"flash_swap": map[string]interface{} {
"get": map[string]interface{} {
"currencies": 1,
},
},
"futures": map[string]interface{} {
"get": map[string]interface{} {
"{settle}/contracts": 1,
"{settle}/contracts/{contract}": 1,
"{settle}/order_book": 1,
"{settle}/trades": 1,
"{settle}/candlesticks": 1,
"{settle}/premium_index": 1,
"{settle}/tickers": 1,
"{settle}/funding_rate": 1,
"{settle}/insurance": 1,
"{settle}/contract_stats": 1,
"{settle}/index_constituents/{index}": 1,
"{settle}/liq_orders": 1,
"{settle}/risk_limit_tiers": 1,
},
},
"delivery": map[string]interface{} {
"get": map[string]interface{} {
"{settle}/contracts": 1,
"{settle}/contracts/{contract}": 1,
"{settle}/order_book": 1,
"{settle}/trades": 1,
"{settle}/candlesticks": 1,
"{settle}/tickers": 1,
"{settle}/insurance": 1,
},
},
"options": map[string]interface{} {
"get": map[string]interface{} {
"underlyings": 1,
"expirations": 1,
"contracts": 1,
"contracts/{contract}": 1,
"settlements": 1,
"settlements/{contract}": 1,
"order_book": 1,
"tickers": 1,
"underlying/tickers/{underlying}": 1,
"candlesticks": 1,
"underlying/candlesticks": 1,
"trades": 1,
},
},
"earn": map[string]interface{} {
"get": map[string]interface{} {
"uni/currencies": 1,
"uni/currencies/{currency}": 1,
},
},
},
"private": map[string]interface{} {
"withdrawals": map[string]interface{} {
"post": map[string]interface{} {
"withdrawals": 20,
"push": 1,
},
"delete": map[string]interface{} {
"withdrawals/{withdrawal_id}": 1,
},
},
"wallet": map[string]interface{} {
"get": map[string]interface{} {
"deposit_address": 1,
"withdrawals": 1,
"deposits": 1,
"sub_account_transfers": 1,
"order_status": 1,
"withdraw_status": 1,
"sub_account_balances": 2.5,
"sub_account_margin_balances": 2.5,
"sub_account_futures_balances": 2.5,
"sub_account_cross_margin_balances": 2.5,
"saved_address": 1,
"fee": 1,
"total_balance": 2.5,
"small_balance": 1,
"small_balance_history": 1,
"push": 1,
},
"post": map[string]interface{} {
"transfers": 2.5,
"sub_account_transfers": 2.5,
"sub_account_to_sub_account": 2.5,
"small_balance": 1,
},
},
"subAccounts": map[string]interface{} {
"get": map[string]interface{} {
"sub_accounts": 2.5,
"sub_accounts/{user_id}": 2.5,
"sub_accounts/{user_id}/keys": 2.5,
"sub_accounts/{user_id}/keys/{key}": 2.5,
},
"post": map[string]interface{} {
"sub_accounts": 2.5,
"sub_accounts/{user_id}/keys": 2.5,
"sub_accounts/{user_id}/lock": 2.5,
"sub_accounts/{user_id}/unlock": 2.5,
},
"put": map[string]interface{} {
"sub_accounts/{user_id}/keys/{key}": 2.5,
},
"delete": map[string]interface{} {
"sub_accounts/{user_id}/keys/{key}": 2.5,
},
},
"unified": map[string]interface{} {
"get": map[string]interface{} {
"accounts": Divide(20, 15),
"account_mode": Divide(20, 15),
"borrowable": Divide(20, 15),
"transferable": Divide(20, 15),
"loans": Divide(20, 15),
"loan_records": Divide(20, 15),
"interest_records": Divide(20, 15),
"estimate_rate": Divide(20, 15),
"currency_discount_tiers": Divide(20, 15),
"risk_units": Divide(20, 15),
"unified_mode": Divide(20, 15),
"loan_margin_tiers": Divide(20, 15),
"leverage/user_currency_config": Divide(20, 15),
"leverage/user_currency_setting": Divide(20, 15),
},
"post": map[string]interface{} {
"account_mode": Divide(20, 15),
"loans": Divide(200, 15),
"portfolio_calculator": Divide(20, 15),
"leverage/user_currency_setting": Divide(20, 15),
},
"put": map[string]interface{} {
"unified_mode": Divide(20, 15),
},
},
"spot": map[string]interface{} {
"get": map[string]interface{} {
"fee": 1,
"batch_fee": 1,
"accounts": 1,
"account_book": 1,
"open_orders": 1,
"orders": 1,
"orders/{order_id}": 1,
"my_trades": 1,
"price_orders": 1,
"price_orders/{order_id}": 1,
},
"post": map[string]interface{} {
"batch_orders": 0.4,
"cross_liquidate_orders": 1,
"orders": 0.4,
"cancel_batch_orders": Divide(20, 75),
"countdown_cancel_all": Divide(20, 75),
"amend_batch_orders": 0.4,
"price_orders": 0.4,
},
"delete": map[string]interface{} {
"orders": Divide(20, 75),
"orders/{order_id}": Divide(20, 75),
"price_orders": Divide(20, 75),
"price_orders/{order_id}": Divide(20, 75),
},
"patch": map[string]interface{} {
"orders/{order_id}": 0.4,
},
},
"margin": map[string]interface{} {
"get": map[string]interface{} {
"accounts": Divide(20, 15),
"account_book": Divide(20, 15),
"funding_accounts": Divide(20, 15),
"auto_repay": Divide(20, 15),
"transferable": Divide(20, 15),
"loans": Divide(20, 15),
"loans/{loan_id}": Divide(20, 15),
"loans/{loan_id}/repayment": Divide(20, 15),
"loan_records": Divide(20, 15),
"loan_records/{loan_record_id}": Divide(20, 15),
"borrowable": Divide(20, 15),
"cross/accounts": Divide(20, 15),
"cross/account_book": Divide(20, 15),
"cross/loans": Divide(20, 15),
"cross/loans/{loan_id}": Divide(20, 15),
"cross/repayments": Divide(20, 15),
"cross/interest_records": Divide(20, 15),
"cross/transferable": Divide(20, 15),
"cross/estimate_rate": Divide(20, 15),
"cross/borrowable": Divide(20, 15),
"uni/estimate_rate": Divide(20, 15),
"uni/loans": Divide(20, 15),
"uni/loan_records": Divide(20, 15),
"uni/interest_records": Divide(20, 15),
"uni/borrowable": Divide(20, 15),
},
"post": map[string]interface{} {
"auto_repay": Divide(20, 15),
"loans": Divide(20, 15),
"merged_loans": Divide(20, 15),
"loans/{loan_id}/repayment": Divide(20, 15),
"cross/loans": Divide(20, 15),
"cross/repayments": Divide(20, 15),
"uni/loans": Divide(20, 15),
},
"patch": map[string]interface{} {
"loans/{loan_id}": Divide(20, 15),
"loan_records/{loan_record_id}": Divide(20, 15),
},
"delete": map[string]interface{} {
"loans/{loan_id}": Divide(20, 15),
},
},
"flash_swap": map[string]interface{} {
"get": map[string]interface{} {
"currencies": 1,
"currency_pairs": 1,
"orders": 1,
"orders/{order_id}": 1,
},
"post": map[string]interface{} {
"orders": 1,
"orders/preview": 1,
},
},
"futures": map[string]interface{} {
"get": map[string]interface{} {
"{settle}/accounts": 1,
"{settle}/account_book": 1,
"{settle}/positions": 1,
"{settle}/positions/{contract}": 1,
"{settle}/dual_comp/positions/{contract}": 1,
"{settle}/orders": 1,
"{settle}/orders_timerange": 1,
"{settle}/orders/{order_id}": 1,
"{settle}/my_trades": 1,
"{settle}/my_trades_timerange": 1,
"{settle}/position_close": 1,
"{settle}/liquidates": 1,
"{settle}/auto_deleverages": 1,
"{settle}/fee": 1,
"{settle}/risk_limit_tiers": 1,
"{settle}/price_orders": 1,
"{settle}/price_orders/{order_id}": 1,
},
"post": map[string]interface{} {
"{settle}/positions/{contract}/margin": 1,
"{settle}/positions/{contract}/leverage": 1,
"{settle}/positions/{contract}/risk_limit": 1,
"{settle}/dual_mode": 1,
"{settle}/dual_comp/positions/{contract}/margin": 1,
"{settle}/dual_comp/positions/{contract}/leverage": 1,
"{settle}/dual_comp/positions/{contract}/risk_limit": 1,
"{settle}/orders": 0.4,
"{settle}/batch_orders": 0.4,
"{settle}/countdown_cancel_all": 0.4,
"{settle}/batch_cancel_orders": 0.4,
"{settle}/price_orders": 0.4,
},
"put": map[string]interface{} {
"{settle}/orders/{order_id}": 1,
},
"delete": map[string]interface{} {
"{settle}/orders": Divide(20, 75),
"{settle}/orders/{order_id}": Divide(20, 75),
"{settle}/price_orders": Divide(20, 75),
"{settle}/price_orders/{order_id}": Divide(20, 75),
},
},
"delivery": map[string]interface{} {
"get": map[string]interface{} {
"{settle}/accounts": Divide(20, 15),
"{settle}/account_book": Divide(20, 15),
"{settle}/positions": Divide(20, 15),
"{settle}/positions/{contract}": Divide(20, 15),
"{settle}/orders": Divide(20, 15),
"{settle}/orders/{order_id}": Divide(20, 15),
"{settle}/my_trades": Divide(20, 15),
"{settle}/position_close": Divide(20, 15),
"{settle}/liquidates": Divide(20, 15),
"{settle}/settlements": Divide(20, 15),
"{settle}/price_orders": Divide(20, 15),
"{settle}/price_orders/{order_id}": Divide(20, 15),
},
"post": map[string]interface{} {
"{settle}/positions/{contract}/margin": Divide(20, 15),
"{settle}/positions/{contract}/leverage": Divide(20, 15),
"{settle}/positions/{contract}/risk_limit": Divide(20, 15),
"{settle}/orders": Divide(20, 15),
"{settle}/price_orders": Divide(20, 15),
},
"delete": map[string]interface{} {
"{settle}/orders": Divide(20, 15),
"{settle}/orders/{order_id}": Divide(20, 15),
"{settle}/price_orders": Divide(20, 15),
"{settle}/price_orders/{order_id}": Divide(20, 15),
},
},
"options": map[string]interface{} {
"get": map[string]interface{} {
"my_settlements": Divide(20, 15),
"accounts": Divide(20, 15),
"account_book": Divide(20, 15),
"positions": Divide(20, 15),
"positions/{contract}": Divide(20, 15),
"position_close": Divide(20, 15),
"orders": Divide(20, 15),
"orders/{order_id}": Divide(20, 15),
"my_trades": Divide(20, 15),
"mmp": Divide(20, 15),
},
"post": map[string]interface{} {
"orders": Divide(20, 15),
"countdown_cancel_all": Divide(20, 15),
"mmp": Divide(20, 15),
"mmp/reset": Divide(20, 15),
},
"delete": map[string]interface{} {
"orders": Divide(20, 15),
"orders/{order_id}": Divide(20, 15),
},
},
"earn": map[string]interface{} {
"get": map[string]interface{} {
"uni/currencies": Divide(20, 15),
"uni/currencies/{currency}": Divide(20, 15),
"uni/lends": Divide(20, 15),
"uni/lend_records": Divide(20, 15),
"uni/interests/{currency}": Divide(20, 15),
"uni/interest_records": Divide(20, 15),
"uni/interest_status/{currency}": Divide(20, 15),
},
"post": map[string]interface{} {
"uni/lends": Divide(20, 15),
},
"put": map[string]interface{} {
"uni/interest_reinvest": Divide(20, 15),
},
"patch": map[string]interface{} {
"uni/lends": Divide(20, 15),
},
},
"loan": map[string]interface{} {
"get": map[string]interface{} {
"collateral/orders": Divide(20, 15),
"collateral/orders/{order_id}": Divide(20, 15),
"collateral/repay_records": Divide(20, 15),
"collateral/collaterals": Divide(20, 15),
"collateral/total_amount": Divide(20, 15),
"collateral/ltv": Divide(20, 15),
"collateral/currencies": Divide(20, 15),
"multi_collateral/orders": Divide(20, 15),
"multi_collateral/orders/{order_id}": Divide(20, 15),
"multi_collateral/repay": Divide(20, 15),
"multi_collateral/mortgage": Divide(20, 15),
"multi_collateral/currency_quota": Divide(20, 15),
"multi_collateral/currencies": Divide(20, 15),
"multi_collateral/ltv": Divide(20, 15),
"multi_collateral/fixed_rate": Divide(20, 15),
"multi_collateral/current_rate": Divide(20, 15),
},
"post": map[string]interface{} {
"collateral/orders": Divide(20, 15),
"collateral/repay": Divide(20, 15),
"collateral/collaterals": Divide(20, 15),
"multi_collateral/orders": Divide(20, 15),
"multi_collateral/repay": Divide(20, 15),
"multi_collateral/mortgage": Divide(20, 15),
},
},
"account": map[string]interface{} {
"get": map[string]interface{} {
"detail": Divide(20, 15),
"rate_limit": Divide(20, 15),
"stp_groups": Divide(20, 15),
"stp_groups/{stp_id}/users": Divide(20, 15),
"stp_groups/debit_fee": Divide(20, 15),
},
"post": map[string]interface{} {
"stp_groups": Divide(20, 15),
"stp_groups/{stp_id}/users": Divide(20, 15),
},
"delete": map[string]interface{} {
"stp_groups/{stp_id}/users": Divide(20, 15),
},
},
"rebate": map[string]interface{} {
"get": map[string]interface{} {
"agency/transaction_history": Divide(20, 15),
"agency/commission_history": Divide(20, 15),
},
},
},
},
"timeframes": map[string]interface{} {
"10s": "10s",
"1m": "1m",
"5m": "5m",
"15m": "15m",
"30m": "30m",
"1h": "1h",
"2h": "2h",
"4h": "4h",
"8h": "8h",
"1d": "1d",
"7d": "7d",
"1w": "7d",
},
"commonCurrencies": map[string]interface{} {
"ORT": "XREATORS",
"ASS": "ASSF",
"88MPH": "MPH",
"AXIS": "AXISDEFI",
"BIFI": "BITCOINFILE",
"BOX": "DEFIBOX",
"BYN": "BEYONDFI",
"EGG": "GOOSEFINANCE",
"GTC": "GAMECOM",
"GTC_HT": "GAMECOM_HT",
"GTC_BSC": "GAMECOM_BSC",
"HIT": "HITCHAIN",
"MM": "MILLION",
"MPH": "MORPHER",
"POINT": "GATEPOINT",
"RAI": "RAIREFLEXINDEX",
"RED": "RedLang",
"SBTC": "SUPERBITCOIN",
"TNC": "TRINITYNETWORKCREDIT",
"VAI": "VAIOT",
"TRAC": "TRACO",
},
"requiredCredentials": map[string]interface{} {
"apiKey": true,
"secret": true,
},
"headers": map[string]interface{} {
"X-Gate-Channel-Id": "ccxt",
},
"options": map[string]interface{} {
"timeDifference": 0,
"adjustForTimeDifference": false,
"sandboxMode": false,
"unifiedAccount": nil,
"createOrder": map[string]interface{} {
"expiration": 86400,
},
"createMarketBuyOrderRequiresPrice": true,
"networks": map[string]interface{} {
"BTC": "BTC",
"BRC20": "BTCBRC",
"ETH": "ETH",
"ERC20": "ETH",
"TRX": "TRX",
"TRC20": "TRX",
"HECO": "HT",
"HRC20": "HT",
"BSC": "BSC",
"BEP20": "BSC",
"SOL": "SOL",
"POLYGON": "POL",
"MATIC": "POL",
"OP": "OPETH",
"OPTIMISM": "OPETH",
"ADA": "ADA",
"AVAXC": "AVAX_C",
"NEAR": "NEAR",
"ARBONE": "ARBEVM",
"BASE": "BASEEVM",
"SUI": "SUI",
"CRONOS": "CRO",
"CRO": "CRO",
"APT": "APT",
"SCROLL": "SCROLLETH",
"TAIKO": "TAIKOETH",
"HYPE": "HYPE",
"ALGO": "ALGO",
"LINEA": "LINEAETH",
"BLAST": "BLASTETH",
"XLM": "XLM",
"RSK": "RBTC",
"TON": "TON",
"MNT": "MNT",
"CELO": "CELO",
"HBAR": "HBAR",
"ZKSERA": "ZKSERA",
"KLAY": "KLAY",
"EOS": "EOS",
"ACA": "ACA",
"XTZ": "XTZ",
"EGLD": "EGLD",
"GLMR": "GLMR",
"AURORA": "AURORAEVM",
"KON": "KONET",
"GATECHAIN": "GTEVM",
"KUSAMA": "KSMSM",
"OKC": "OKT",
"POLKADOT": "DOTSM",
"LUNA": "LUNC",
},
"networksById": map[string]interface{} {
"OPETH": "OP",
},
"timeInForce": map[string]interface{} {
"GTC": "gtc",
"IOC": "ioc",
"PO": "poc",
"POC": "poc",
"FOK": "fok",
},
"accountsByType": map[string]interface{} {
"funding": "spot",
"spot": "spot",
"margin": "margin",
"cross_margin": "cross_margin",
"cross": "cross_margin",
"isolated": "margin",
"swap": "futures",
"future": "delivery",
"futures": "futures",
"delivery": "delivery",
"option": "options",
"options": "options",
},
"swap": map[string]interface{} {
"fetchMarkets": map[string]interface{} {
"settlementCurrencies": []interface{}{"usdt", "btc"},
},
},
"future": map[string]interface{} {
"fetchMarkets": map[string]interface{} {
"settlementCurrencies": []interface{}{"usdt"},
},
},
},
"features": map[string]interface{} {
"default": map[string]interface{} {
"sandbox": true,
"createOrder": map[string]interface{} {
"marginMode": true,
"triggerPrice": true,
"triggerDirection": true,
"triggerPriceType": nil,
"stopLossPrice": true,
"takeProfitPrice": true,
"attachedStopLossTakeProfit": nil,
"timeInForce": map[string]interface{} {
"IOC": true,
"FOK": true,
"PO": true,
"GTD": false,
},
"hedged": false,
"trailing": false,
"iceberg": true,
"selfTradePrevention": true,
"leverage": false,
"marketBuyByCost": true,
"marketBuyRequiresPrice": true,
},
"createOrders": map[string]interface{} {
"max": 40,
},
"fetchMyTrades": map[string]interface{} {
"marginMode": true,
"limit": 1000,
"daysBack": nil,
"untilDays": 30,
"symbolRequired": false,
},
"fetchOrder": map[string]interface{} {
"marginMode": false,
"trigger": true,
"trailing": false,
"symbolRequired": true,
},
"fetchOpenOrders": map[string]interface{} {
"marginMode": true,
"trigger": true,
"trailing": false,
"limit": 100,
"symbolRequired": false,
},
"fetchOrders": nil,
"fetchClosedOrders": map[string]interface{} {
"marginMode": true,
"trigger": true,
"trailing": false,
"limit": 100,
"untilDays": 30,
"daysBack": nil,
"daysBackCanceled": nil,
"symbolRequired": false,
},
"fetchOHLCV": map[string]interface{} {
"limit": 1000,
},
},
"spot": map[string]interface{} {
"extends": "default",
},
"forDerivatives": map[string]interface{} {
"extends": "spot",
"createOrder": map[string]interface{} {
"marginMode": false,
"triggerPriceType": map[string]interface{} {
"last": true,
"mark": true,
"index": true,
},
},
"createOrders": map[string]interface{} {
"max": 10,
},
"fetchMyTrades": map[string]interface{} {
"marginMode": false,
"untilDays": nil,
},
"fetchOpenOrders": map[string]interface{} {
"marginMode": false,
},
"fetchClosedOrders": map[string]interface{} {
"marginMode": false,
"untilDays": nil,
"limit": 1000,
},
"fetchOHLCV": map[string]interface{} {
"limit": 1999,
},
},
"swap": map[string]interface{} {
"linear": map[string]interface{} {
"extends": "forDerivatives",
},
"inverse": map[string]interface{} {
"extends": "forDerivatives",
},
},
"future": map[string]interface{} {
"linear": map[string]interface{} {
"extends": "forDerivatives",
},
"inverse": map[string]interface{} {
"extends": "forDerivatives",
},
},
},
"precisionMode": TICK_SIZE,
"fees": map[string]interface{} {
"trading": map[string]interface{} {
"tierBased": true,
"feeSide": "get",
"percentage": true,
"maker": this.ParseNumber("0.002"),
"taker": this.ParseNumber("0.002"),
"tiers": map[string]interface{} {
"maker": []interface{}{[]interface{}{this.ParseNumber("0"), this.ParseNumber("0.002")}, []interface{}{this.ParseNumber("1.5"), this.ParseNumber("0.00185")}, []interface{}{this.ParseNumber("3"), this.ParseNumber("0.00175")}, []interface{}{this.ParseNumber("6"), this.ParseNumber("0.00165")}, []interface{}{this.ParseNumber("12.5"), this.ParseNumber("0.00155")}, []interface{}{this.ParseNumber("25"), this.ParseNumber("0.00145")}, []interface{}{this.ParseNumber("75"), this.ParseNumber("0.00135")}, []interface{}{this.ParseNumber("200"), this.ParseNumber("0.00125")}, []interface{}{this.ParseNumber("500"), this.ParseNumber("0.00115")}, []interface{}{this.ParseNumber("1250"), this.ParseNumber("0.00105")}, []interface{}{this.ParseNumber("2500"), this.ParseNumber("0.00095")}, []interface{}{this.ParseNumber("3000"), this.ParseNumber("0.00085")}, []interface{}{this.ParseNumber("6000"), this.ParseNumber("0.00075")}, []interface{}{this.ParseNumber("11000"), this.ParseNumber("0.00065")}, []interface{}{this.ParseNumber("20000"), this.ParseNumber("0.00055")}, []interface{}{this.ParseNumber("40000"), this.ParseNumber("0.00055")}, []interface{}{this.ParseNumber("75000"), this.ParseNumber("0.00055")}},
"taker": []interface{}{[]interface{}{this.ParseNumber("0"), this.ParseNumber("0.002")}, []interface{}{this.ParseNumber("1.5"), this.ParseNumber("0.00195")}, []interface{}{this.ParseNumber("3"), this.ParseNumber("0.00185")}, []interface{}{this.ParseNumber("6"), this.ParseNumber("0.00175")}, []interface{}{this.ParseNumber("12.5"), this.ParseNumber("0.00165")}, []interface{}{this.ParseNumber("25"), this.ParseNumber("0.00155")}, []interface{}{this.ParseNumber("75"), this.ParseNumber("0.00145")}, []interface{}{this.ParseNumber("200"), this.ParseNumber("0.00135")}, []interface{}{this.ParseNumber("500"), this.ParseNumber("0.00125")}, []interface{}{this.ParseNumber("1250"), this.ParseNumber("0.00115")}, []interface{}{this.ParseNumber("2500"), this.ParseNumber("0.00105")}, []interface{}{this.ParseNumber("3000"), this.ParseNumber("0.00095")}, []interface{}{this.ParseNumber("6000"), this.ParseNumber("0.00085")}, []interface{}{this.ParseNumber("11000"), this.ParseNumber("0.00075")}, []interface{}{this.ParseNumber("20000"), this.ParseNumber("0.00065")}, []interface{}{this.ParseNumber("40000"), this.ParseNumber("0.00065")}, []interface{}{this.ParseNumber("75000"), this.ParseNumber("0.00065")}},
},
},
"swap": map[string]interface{} {
"tierBased": true,
"feeSide": "base",
"percentage": true,
"maker": this.ParseNumber("0.0"),
"taker": this.ParseNumber("0.0005"),
"tiers": map[string]interface{} {
"maker": []interface{}{[]interface{}{this.ParseNumber("0"), this.ParseNumber("0.0000")}, []interface{}{this.ParseNumber("1.5"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("3"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("6"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("12.5"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("25"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("75"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("200"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("500"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("1250"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("2500"), this.ParseNumber("-0.00005")}, []interface{}{this.ParseNumber("3000"), this.ParseNumber("-0.00008")}, []interface{}{this.ParseNumber("6000"), this.ParseNumber("-0.01000")}, []interface{}{this.ParseNumber("11000"), this.ParseNumber("-0.01002")}, []interface{}{this.ParseNumber("20000"), this.ParseNumber("-0.01005")}, []interface{}{this.ParseNumber("40000"), this.ParseNumber("-0.02000")}, []interface{}{this.ParseNumber("75000"), this.ParseNumber("-0.02005")}},
"taker": []interface{}{[]interface{}{this.ParseNumber("0"), this.ParseNumber("0.00050")}, []interface{}{this.ParseNumber("1.5"), this.ParseNumber("0.00048")}, []interface{}{this.ParseNumber("3"), this.ParseNumber("0.00046")}, []interface{}{this.ParseNumber("6"), this.ParseNumber("0.00044")}, []interface{}{this.ParseNumber("12.5"), this.ParseNumber("0.00042")}, []interface{}{this.ParseNumber("25"), this.ParseNumber("0.00040")}, []interface{}{this.ParseNumber("75"), this.ParseNumber("0.00038")}, []interface{}{this.ParseNumber("200"), this.ParseNumber("0.00036")}, []interface{}{this.ParseNumber("500"), this.ParseNumber("0.00034")}, []interface{}{this.ParseNumber("1250"), this.ParseNumber("0.00032")}, []interface{}{this.ParseNumber("2500"), this.ParseNumber("0.00030")}, []interface{}{this.ParseNumber("3000"), this.ParseNumber("0.00030")}, []interface{}{this.ParseNumber("6000"), this.ParseNumber("0.00030")}, []interface{}{this.ParseNumber("11000"), this.ParseNumber("0.00030")}, []interface{}{this.ParseNumber("20000"), this.ParseNumber("0.00030")}, []interface{}{this.ParseNumber("40000"), this.ParseNumber("0.00030")}, []interface{}{this.ParseNumber("75000"), this.ParseNumber("0.00030")}},
},
},
},
"exceptions": map[string]interface{} {
"exact": map[string]interface{} {
"INVALID_PARAM_VALUE": BadRequest,
"INVALID_PROTOCOL": BadRequest,
"INVALID_ARGUMENT": BadRequest,
"INVALID_REQUEST_BODY": BadRequest,
"MISSING_REQUIRED_PARAM": ArgumentsRequired,
"BAD_REQUEST": BadRequest,
"INVALID_CONTENT_TYPE": BadRequest,
"NOT_ACCEPTABLE": BadRequest,
"METHOD_NOT_ALLOWED": BadRequest,
"NOT_FOUND": ExchangeError,
"AUTHENTICATION_FAILED": AuthenticationError,
"INVALID_CREDENTIALS": AuthenticationError,
"INVALID_KEY": AuthenticationError,
"IP_FORBIDDEN": AuthenticationError,
"READ_ONLY": PermissionDenied,
"INVALID_SIGNATURE": AuthenticationError,
"MISSING_REQUIRED_HEADER": AuthenticationError,
"REQUEST_EXPIRED": AuthenticationError,
"ACCOUNT_LOCKED": AccountSuspended,
"FORBIDDEN": PermissionDenied,
"SUB_ACCOUNT_NOT_FOUND": ExchangeError,
"SUB_ACCOUNT_LOCKED": AccountSuspended,
"MARGIN_BALANCE_EXCEPTION": ExchangeError,
"MARGIN_TRANSFER_FAILED": ExchangeError,
"TOO_MUCH_FUTURES_AVAILABLE": ExchangeError,
"FUTURES_BALANCE_NOT_ENOUGH": InsufficientFunds,
"ACCOUNT_EXCEPTION": ExchangeError,
"SUB_ACCOUNT_TRANSFER_FAILED": ExchangeError,
"ADDRESS_NOT_USED": ExchangeError,
"TOO_FAST": RateLimitExceeded,
"WITHDRAWAL_OVER_LIMIT": ExchangeError,
"API_WITHDRAW_DISABLED": ExchangeNotAvailable,
"INVALID_WITHDRAW_ID": ExchangeError,
"INVALID_WITHDRAW_CANCEL_STATUS": ExchangeError,
"INVALID_PRECISION": InvalidOrder,
"INVALID_CURRENCY": BadSymbol,
"INVALID_CURRENCY_PAIR": BadSymbol,
"POC_FILL_IMMEDIATELY": OrderImmediatelyFillable,
"ORDER_NOT_FOUND": OrderNotFound,
"CLIENT_ID_NOT_FOUND": OrderNotFound,
"ORDER_CLOSED": InvalidOrder,
"ORDER_CANCELLED": InvalidOrder,
"QUANTITY_NOT_ENOUGH": InvalidOrder,
"BALANCE_NOT_ENOUGH": InsufficientFunds,
"MARGIN_NOT_SUPPORTED": InvalidOrder,
"MARGIN_BALANCE_NOT_ENOUGH": InsufficientFunds,
"AMOUNT_TOO_LITTLE": InvalidOrder,
"AMOUNT_TOO_MUCH": InvalidOrder,
"REPEATED_CREATION": InvalidOrder,
"LOAN_NOT_FOUND": OrderNotFound,
"LOAN_RECORD_NOT_FOUND": OrderNotFound,
"NO_MATCHED_LOAN": ExchangeError,
"NOT_MERGEABLE": ExchangeError,
"NO_CHANGE": ExchangeError,
"REPAY_TOO_MUCH": ExchangeError,
"TOO_MANY_CURRENCY_PAIRS": InvalidOrder,
"TOO_MANY_ORDERS": InvalidOrder,
"TOO_MANY_REQUESTS": RateLimitExceeded,
"MIXED_ACCOUNT_TYPE": InvalidOrder,
"AUTO_BORROW_TOO_MUCH": ExchangeError,
"TRADE_RESTRICTED": InsufficientFunds,
"USER_NOT_FOUND": AccountNotEnabled,
"CONTRACT_NO_COUNTER": ExchangeError,
"CONTRACT_NOT_FOUND": BadSymbol,
"RISK_LIMIT_EXCEEDED": ExchangeError,
"INSUFFICIENT_AVAILABLE": InsufficientFunds,
"LIQUIDATE_IMMEDIATELY": InvalidOrder,
"LEVERAGE_TOO_HIGH": InvalidOrder,
"LEVERAGE_TOO_LOW": InvalidOrder,
"ORDER_NOT_OWNED": ExchangeError,
"ORDER_FINISHED": ExchangeError,
"POSITION_CROSS_MARGIN": ExchangeError,
"POSITION_IN_LIQUIDATION": ExchangeError,
"POSITION_IN_CLOSE": ExchangeError,
"POSITION_EMPTY": InvalidOrder,
"REMOVE_TOO_MUCH": ExchangeError,
"RISK_LIMIT_NOT_MULTIPLE": ExchangeError,
"RISK_LIMIT_TOO_HIGH": ExchangeError,
"RISK_LIMIT_TOO_lOW": ExchangeError,
"PRICE_TOO_DEVIATED": InvalidOrder,
"SIZE_TOO_LARGE": InvalidOrder,
"SIZE_TOO_SMALL": InvalidOrder,
"PRICE_OVER_LIQUIDATION": InvalidOrder,
"PRICE_OVER_BANKRUPT": InvalidOrder,
"ORDER_POC_IMMEDIATE": OrderImmediatelyFillable,
"INCREASE_POSITION": InvalidOrder,
"CONTRACT_IN_DELISTING": ExchangeError,
"INTERNAL": ExchangeNotAvailable,
"SERVER_ERROR": ExchangeNotAvailable,
"TOO_BUSY": ExchangeNotAvailable,
"CROSS_ACCOUNT_NOT_FOUND": ExchangeError,
"RISK_LIMIT_TOO_LOW": BadRequest,
"AUTO_TRIGGER_PRICE_LESS_LAST": InvalidOrder,
"AUTO_TRIGGER_PRICE_GREATE_LAST": InvalidOrder,
"POSITION_HOLDING": BadRequest,
"USER_LOAN_EXCEEDED": BadRequest,
},
"broad": map[string]interface{} {},
},
})
}
func (this *gate) SetSandboxMode(enable interface{}) {
this.Exchange.SetSandboxMode(enable)
AddElementToObject(this.Options, "sandboxMode", enable)
}
/**
* @method
* @name gate#loadUnifiedStatus
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @description returns unifiedAccount so the user can check if the unified account is enabled
* @see https://www.gate.io/docs/developers/apiv4/#get-account-detail
* @returns {boolean} true or false if the enabled unified account is enabled or not and sets the unifiedAccount option if it is undefined
*/
func (this *gate) LoadUnifiedStatus(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 unifiedAccount interface{} = this.SafeBool(this.Options, "unifiedAccount")
if IsTrue(IsEqual(unifiedAccount, nil)) {
{ ret__ := func(this *gate) (ret_ interface{}) {
defer func() {
if e := recover(); e != nil {
if e == "break" {
return
}
ret_ = func(this *gate) interface{} {
// catch block:
// if the request fails, the unifiedAccount is disabled
AddElementToObject(this.Options, "unifiedAccount", false)
return nil
}(this)
}
}()
// try block:
//
// {
// "user_id": 10406147,
// "ip_whitelist": [],
// "currency_pairs": [],
// "key": {
// "mode": 1
// },
// "tier": 0,
// "tier_expire_time": "0001-01-01T00:00:00Z",
// "copy_trading_role": 0
// }
//
response:= (<-this.PrivateAccountGetDetail(params))
PanicOnError(response)
var result interface{} = this.SafeDict(response, "key", map[string]interface{} {})
AddElementToObject(this.Options, "unifiedAccount", IsEqual(this.SafeInteger(result, "mode"), 2))
return nil
}(this)
if ret__ != nil {
return ret__
}
}
}
ch <- GetValue(this.Options, "unifiedAccount")
return nil
}()
return ch
}
func (this *gate) UpgradeUnifiedTradeAccount(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
retRes110915 := (<-this.PrivateUnifiedPutUnifiedMode(params))
PanicOnError(retRes110915)
ch <- retRes110915
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchTime
* @description fetches the current integer timestamp in milliseconds from the exchange server
* @see https://www.gate.io/docs/developers/apiv4/en/#get-server-current-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 *gate) 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.PublicSpotGetTime(params))
PanicOnError(response)
//
// {
// "server_time": 1731447921098
// }
//
ch <- this.SafeInteger(response, "server_time")
return nil
}()
return ch
}
func (this *gate) CreateExpiredOptionMarket(symbol interface{}) interface{} {
// support expired option contracts
var quote interface{} = "USDT"
var settle interface{} = quote
var optionParts interface{} = Split(symbol, "-")
var symbolBase interface{} = Split(symbol, "/")
var marketIdBase interface{} = Split(symbol, "_")
var base interface{} = nil
var expiry interface{} = this.SafeString(optionParts, 1)
if IsTrue(IsGreaterThan(GetIndexOf(symbol, "/"), OpNeg(1))) {
base = this.SafeString(symbolBase, 0)
} else {
base = this.SafeString(marketIdBase, 0)
expiry = Slice(expiry, 2, 8) // convert 20230728 to 230728
}
var strike interface{} = this.SafeString(optionParts, 2)
var optionType interface{} = this.SafeString(optionParts, 3)
var datetime interface{} = this.ConvertExpireDate(expiry)
var timestamp interface{} = this.Parse8601(datetime)
return map[string]interface{} {
"id": Add(Add(Add(Add(Add(Add(Add(Add(Add(base, "_"), quote), "-"), "20"), expiry), "-"), strike), "-"), optionType),
"symbol": Add(Add(Add(Add(Add(Add(Add(Add(Add(Add(base, "/"), quote), ":"), settle), "-"), expiry), "-"), strike), "-"), optionType),
"base": base,
"quote": quote,
"settle": settle,
"baseId": base,
"quoteId": quote,
"settleId": settle,
"active": false,
"type": "option",
"linear": nil,
"inverse": nil,
"spot": false,
"swap": false,
"future": false,
"option": true,
"margin": false,
"contract": true,
"contractSize": this.ParseNumber("1"),
"expiry": timestamp,
"expiryDatetime": datetime,
"optionType": Ternary(IsTrue((IsEqual(optionType, "C"))), "call", "put"),
"strike": this.ParseNumber(strike),
"precision": map[string]interface{} {
"amount": this.ParseNumber("1"),
"price": nil,
},
"limits": map[string]interface{} {
"amount": map[string]interface{} {
"min": nil,
"max": nil,
},
"price": map[string]interface{} {
"min": nil,
"max": nil,
},
"cost": map[string]interface{} {
"min": nil,
"max": nil,
},
},
"info": nil,
}
}
func (this *gate) SafeMarket(optionalArgs ...interface{}) interface{} {
marketId := GetArg(optionalArgs, 0, nil)
_ = marketId
market := GetArg(optionalArgs, 1, nil)
_ = market
delimiter := GetArg(optionalArgs, 2, nil)
_ = delimiter
marketType := GetArg(optionalArgs, 3, nil)
_ = marketType
var isOption interface{} = IsTrue((!IsEqual(marketId, nil))) && IsTrue((IsTrue((IsGreaterThan(GetIndexOf(marketId, "-C"), OpNeg(1)))) || IsTrue((IsGreaterThan(GetIndexOf(marketId, "-P"), OpNeg(1))))))
if IsTrue(IsTrue(isOption) && !IsTrue((InOp(this.Markets_by_id, marketId)))) {
// handle expired option contracts
return this.CreateExpiredOptionMarket(marketId)
}
return this.Exchange.SafeMarket(marketId, market, delimiter, marketType)
}
/**
* @method
* @name gate#fetchMarkets
* @description retrieves data on all markets for gate
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-currency-pairs-supported // spot
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-supported-currency-pairs-supported-in-margin-trading // margin
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts // swap
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts-2 // future
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-the-contracts-with-specified-underlying-and-expiration-time // option
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} an array of objects representing market data
*/
func (this *gate) 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")) {
retRes121812 := (<-this.LoadTimeDifference())
PanicOnError(retRes121812)
}
var sandboxMode interface{} = this.SafeBool(this.Options, "sandboxMode", false)
var rawPromises interface{} = []interface{}{this.FetchContractMarkets(params), this.FetchOptionMarkets(params)}
if !IsTrue(sandboxMode) {
// gate does not have a sandbox for spot markets
var mainnetOnly interface{} = []interface{}{this.FetchSpotMarkets(params)}
rawPromises = this.ArrayConcat(rawPromises, mainnetOnly)
}
promises:= (<-promiseAll(rawPromises))
PanicOnError(promises)
var spotMarkets interface{} = this.SafeValue(promises, 0, []interface{}{})
var contractMarkets interface{} = this.SafeValue(promises, 1, []interface{}{})
var optionMarkets interface{} = this.SafeValue(promises, 2, []interface{}{})
var markets interface{} = this.ArrayConcat(spotMarkets, contractMarkets)
ch <- this.ArrayConcat(markets, optionMarkets)
return nil
}()
return ch
}
func (this *gate) FetchSpotMarkets(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 marginPromise interface{} = this.PublicMarginGetCurrencyPairs(params)
var spotMarketsPromise interface{} = this.PublicSpotGetCurrencyPairs(params)
marginResponsespotMarketsResponseVariable := (<-promiseAll([]interface{}{marginPromise, spotMarketsPromise}));
marginResponse := GetValue(marginResponsespotMarketsResponseVariable,0);
spotMarketsResponse := GetValue(marginResponsespotMarketsResponseVariable,1)
var marginMarkets interface{} = this.IndexBy(marginResponse, "id")
//
// Spot
//
// [
// {
// "id": "QTUM_ETH",
// "base": "QTUM",
// "quote": "ETH",
// "fee": "0.2",
// "min_base_amount": "0.01",
// "min_quote_amount": "0.001",
// "amount_precision": 3,
// "precision": 6,
// "trade_status": "tradable",
// "sell_start": 0,
// "buy_start": 0
// }
// ]
//
// Margin
//
// [
// {
// "id": "ETH_USDT",
// "base": "ETH",
// "quote": "USDT",
// "leverage": 3,
// "min_base_amount": "0.01",
// "min_quote_amount": "100",
// "max_quote_amount": "1000000"
// }
// ]
//
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(spotMarketsResponse)); i++ {
var spotMarket interface{} = GetValue(spotMarketsResponse, i)
var id interface{} = this.SafeString(spotMarket, "id")
var marginMarket interface{} = this.SafeValue(marginMarkets, id)
var market interface{} = this.DeepExtend(marginMarket, spotMarket)
baseIdquoteIdVariable := Split(id, "_");
baseId := GetValue(baseIdquoteIdVariable,0);
quoteId := GetValue(baseIdquoteIdVariable,1)
var base interface{} = this.SafeCurrencyCode(baseId)
var quote interface{} = this.SafeCurrencyCode(quoteId)
var takerPercent interface{} = this.SafeString(market, "fee")
var makerPercent interface{} = this.SafeString(market, "maker_fee_rate", takerPercent)
var amountPrecision interface{} = this.ParseNumber(this.ParsePrecision(this.SafeString(market, "amount_precision")))
var tradeStatus interface{} = this.SafeString(market, "trade_status")
var leverage interface{} = this.SafeNumber(market, "leverage")
var margin interface{} = !IsEqual(leverage, nil)
AppendToArray(&result,map[string]interface{} {
"id": id,
"symbol": Add(Add(base, "/"), quote),
"base": base,
"quote": quote,
"settle": nil,
"baseId": baseId,
"quoteId": quoteId,
"settleId": nil,
"type": "spot",
"spot": true,
"margin": margin,
"swap": false,
"future": false,
"option": false,
"active": (IsEqual(tradeStatus, "tradable")),
"contract": false,
"linear": nil,
"inverse": nil,
"taker": this.ParseNumber(Precise.StringDiv(takerPercent, "100")),
"maker": this.ParseNumber(Precise.StringDiv(makerPercent, "100")),
"contractSize": nil,
"expiry": nil,
"expiryDatetime": nil,
"strike": nil,
"optionType": nil,
"precision": map[string]interface{} {
"amount": amountPrecision,
"price": this.ParseNumber(this.ParsePrecision(this.SafeString(market, "precision"))),
},
"limits": map[string]interface{} {
"leverage": map[string]interface{} {
"min": this.ParseNumber("1"),
"max": this.SafeNumber(market, "leverage", 1),
},
"amount": map[string]interface{} {
"min": this.SafeNumber(spotMarket, "min_base_amount", amountPrecision),
"max": nil,
},
"price": map[string]interface{} {
"min": nil,
"max": nil,
},
"cost": map[string]interface{} {
"min": this.SafeNumber(market, "min_quote_amount"),
"max": Ternary(IsTrue(margin), this.SafeNumber(market, "max_quote_amount"), nil),
},
},
"created": nil,
"info": market,
})
}
ch <- result
return nil
}()
return ch
}
func (this *gate) FetchContractMarkets(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 result interface{} = []interface{}{}
var swapSettlementCurrencies interface{} = this.GetSettlementCurrencies("swap", "fetchMarkets")
var futureSettlementCurrencies interface{} = this.GetSettlementCurrencies("future", "fetchMarkets")
for c := 0; IsLessThan(c, GetArrayLength(swapSettlementCurrencies)); c++ {
var settleId interface{} = GetValue(swapSettlementCurrencies, c)
var request interface{} = map[string]interface{} {
"settle": settleId,
}
response:= (<-this.PublicFuturesGetSettleContracts(this.Extend(request, params)))
PanicOnError(response)
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var parsedMarket interface{} = this.ParseContractMarket(GetValue(response, i), settleId)
AppendToArray(&result,parsedMarket)
}
}
for c := 0; IsLessThan(c, GetArrayLength(futureSettlementCurrencies)); c++ {
var settleId interface{} = GetValue(futureSettlementCurrencies, c)
var request interface{} = map[string]interface{} {
"settle": settleId,
}
response:= (<-this.PublicDeliveryGetSettleContracts(this.Extend(request, params)))
PanicOnError(response)
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var parsedMarket interface{} = this.ParseContractMarket(GetValue(response, i), settleId)
AppendToArray(&result,parsedMarket)
}
}
ch <- result
return nil
}()
return ch
}
func (this *gate) ParseContractMarket(market interface{}, settleId interface{}) interface{} {
//
// Perpetual swap
//
// {
// "name": "BTC_USDT",
// "type": "direct",
// "quanto_multiplier": "0.0001",
// "ref_discount_rate": "0",
// "order_price_deviate": "0.5",
// "maintenance_rate": "0.005",
// "mark_type": "index",
// "last_price": "38026",
// "mark_price": "37985.6",
// "index_price": "37954.92",
// "funding_rate_indicative": "0.000219",
// "mark_price_round": "0.01",
// "funding_offset": 0,
// "in_delisting": false,
// "risk_limit_base": "1000000",
// "interest_rate": "0.0003",
// "order_price_round": "0.1",
// "order_size_min": 1,
// "ref_rebate_rate": "0.2",
// "funding_interval": 28800,
// "risk_limit_step": "1000000",
// "leverage_min": "1",
// "leverage_max": "100",
// "risk_limit_max": "8000000",
// "maker_fee_rate": "-0.00025",
// "taker_fee_rate": "0.00075",
// "funding_rate": "0.002053",
// "order_size_max": 1000000,
// "funding_next_apply": 1610035200,
// "short_users": 977,
// "config_change_time": 1609899548,
// "trade_size": 28530850594,
// "position_size": 5223816,
// "long_users": 455,
// "funding_impact_value": "60000",
// "orders_limit": 50,
// "trade_id": 10851092,
// "orderbook_id": 2129638396
// }
//
// Delivery Futures
//
// {
// "name": "BTC_USDT_20200814",
// "underlying": "BTC_USDT",
// "cycle": "WEEKLY",
// "type": "direct",
// "quanto_multiplier": "0.0001",
// "mark_type": "index",
// "last_price": "9017",
// "mark_price": "9019",
// "index_price": "9005.3",
// "basis_rate": "0.185095",
// "basis_value": "13.7",
// "basis_impact_value": "100000",
// "settle_price": "0",
// "settle_price_interval": 60,
// "settle_price_duration": 1800,
// "settle_fee_rate": "0.0015",
// "expire_time": 1593763200,
// "order_price_round": "0.1",
// "mark_price_round": "0.1",
// "leverage_min": "1",
// "leverage_max": "100",
// "maintenance_rate": "1000000",
// "risk_limit_base": "140.726652109199",
// "risk_limit_step": "1000000",
// "risk_limit_max": "8000000",
// "maker_fee_rate": "-0.00025",
// "taker_fee_rate": "0.00075",
// "ref_discount_rate": "0",
// "ref_rebate_rate": "0.2",
// "order_price_deviate": "0.5",
// "order_size_min": 1,
// "order_size_max": 1000000,
// "orders_limit": 50,
// "orderbook_id": 63,
// "trade_id": 26,
// "trade_size": 435,
// "position_size": 130,
// "config_change_time": 1593158867,
// "in_delisting": false
// }
//
var id interface{} = this.SafeString(market, "name")
var parts interface{} = Split(id, "_")
var baseId interface{} = this.SafeString(parts, 0)
var quoteId interface{} = this.SafeString(parts, 1)
var date interface{} = this.SafeString(parts, 2)
var base interface{} = this.SafeCurrencyCode(baseId)
var quote interface{} = this.SafeCurrencyCode(quoteId)
var settle interface{} = this.SafeCurrencyCode(settleId)
var expiry interface{} = this.SafeTimestamp(market, "expire_time")
var symbol interface{} = ""
var marketType interface{} = "swap"
if IsTrue(!IsEqual(date, nil)) {
symbol = Add(Add(Add(Add(Add(Add(base, "/"), quote), ":"), settle), "-"), this.Yymmdd(expiry, ""))
marketType = "future"
} else {
symbol = Add(Add(Add(Add(base, "/"), quote), ":"), settle)
}
var priceDeviate interface{} = this.SafeString(market, "order_price_deviate")
var markPrice interface{} = this.SafeString(market, "mark_price")
var minMultiplier interface{} = Precise.StringSub("1", priceDeviate)
var maxMultiplier interface{} = Precise.StringAdd("1", priceDeviate)
var minPrice interface{} = Precise.StringMul(minMultiplier, markPrice)
var maxPrice interface{} = Precise.StringMul(maxMultiplier, markPrice)
var takerPercent interface{} = this.SafeString(market, "taker_fee_rate")
var makerPercent interface{} = this.SafeString(market, "maker_fee_rate", takerPercent)
var isLinear interface{} = IsEqual(quote, settle)
return map[string]interface{} {
"id": id,
"symbol": symbol,
"base": base,
"quote": quote,
"settle": settle,
"baseId": baseId,
"quoteId": quoteId,
"settleId": settleId,
"type": marketType,
"spot": false,
"margin": false,
"swap": IsEqual(marketType, "swap"),
"future": IsEqual(marketType, "future"),
"option": IsEqual(marketType, "option"),
"active": true,
"contract": true,
"linear": isLinear,
"inverse": !IsTrue(isLinear),
"taker": this.ParseNumber(Precise.StringDiv(takerPercent, "100")),
"maker": this.ParseNumber(Precise.StringDiv(makerPercent, "100")),
"contractSize": this.SafeNumber(market, "quanto_multiplier"),
"expiry": expiry,
"expiryDatetime": this.Iso8601(expiry),
"strike": nil,
"optionType": nil,
"precision": map[string]interface{} {
"amount": this.ParseNumber("1"),
"price": this.SafeNumber(market, "order_price_round"),
},
"limits": map[string]interface{} {
"leverage": map[string]interface{} {
"min": this.SafeNumber(market, "leverage_min"),
"max": this.SafeNumber(market, "leverage_max"),
},
"amount": map[string]interface{} {
"min": this.SafeNumber(market, "order_size_min"),
"max": this.SafeNumber(market, "order_size_max"),
},
"price": map[string]interface{} {
"min": this.ParseNumber(minPrice),
"max": this.ParseNumber(maxPrice),
},
"cost": map[string]interface{} {
"min": nil,
"max": nil,
},
},
"created": nil,
"info": market,
}
}
func (this *gate) FetchOptionMarkets(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 result interface{} = []interface{}{}
underlyings:= (<-this.FetchOptionUnderlyings())
PanicOnError(underlyings)
for i := 0; IsLessThan(i, GetArrayLength(underlyings)); i++ {
var underlying interface{} = GetValue(underlyings, i)
var query interface{} = this.Extend(map[string]interface{} {}, params)
AddElementToObject(query, "underlying", underlying)
response:= (<-this.PublicOptionsGetContracts(query))
PanicOnError(response)
//
// [
// {
// "orders_limit": "50",
// "order_size_max": "100000",
// "mark_price_round": "0.1",
// "order_size_min": "1",
// "position_limit": "1000000",
// "orderbook_id": "575967",
// "order_price_deviate": "0.9",
// "is_call": true, // true means Call false means Put
// "last_price": "93.9",
// "bid1_size": "0",
// "bid1_price": "0",
// "taker_fee_rate": "0.0004",
// "underlying": "BTC_USDT",
// "create_time": "1646381188",
// "price_limit_fee_rate": "0.1",
// "maker_fee_rate": "0.0004",
// "trade_id": "727",
// "order_price_round": "0.1",
// "settle_fee_rate": "0.0001",
// "trade_size": "1982",
// "ref_rebate_rate": "0",
// "name": "BTC_USDT-20220311-44000-C",
// "underlying_price": "39194.26",
// "strike_price": "44000",
// "multiplier": "0.0001",
// "ask1_price": "0",
// "ref_discount_rate": "0",
// "expiration_time": "1646985600",
// "mark_price": "12.15",
// "position_size": "4",
// "ask1_size": "0",
// "tag": "WEEK"
// }
// ]
//
for j := 0; IsLessThan(j, GetArrayLength(response)); j++ {
var market interface{} = GetValue(response, j)
var id interface{} = this.SafeString(market, "name")
var parts interface{} = Split(underlying, "_")
var baseId interface{} = this.SafeString(parts, 0)
var quoteId interface{} = this.SafeString(parts, 1)
var base interface{} = this.SafeCurrencyCode(baseId)
var quote interface{} = this.SafeCurrencyCode(quoteId)
var symbol interface{} = Add(Add(base, "/"), quote)
var expiry interface{} = this.SafeTimestamp(market, "expiration_time")
var strike interface{} = this.SafeString(market, "strike_price")
var isCall interface{} = this.SafeValue(market, "is_call")
var optionLetter interface{} = Ternary(IsTrue(isCall), "C", "P")
var optionType interface{} = Ternary(IsTrue(isCall), "call", "put")
symbol = Add(Add(Add(Add(Add(Add(Add(Add(symbol, ":"), quote), "-"), this.Yymmdd(expiry)), "-"), strike), "-"), optionLetter)
var priceDeviate interface{} = this.SafeString(market, "order_price_deviate")
var markPrice interface{} = this.SafeString(market, "mark_price")
var minMultiplier interface{} = Precise.StringSub("1", priceDeviate)
var maxMultiplier interface{} = Precise.StringAdd("1", priceDeviate)
var minPrice interface{} = Precise.StringMul(minMultiplier, markPrice)
var maxPrice interface{} = Precise.StringMul(maxMultiplier, markPrice)
var takerPercent interface{} = this.SafeString(market, "taker_fee_rate")
var makerPercent interface{} = this.SafeString(market, "maker_fee_rate", takerPercent)
AppendToArray(&result,map[string]interface{} {
"id": id,
"symbol": symbol,
"base": base,
"quote": quote,
"settle": quote,
"baseId": baseId,
"quoteId": quoteId,
"settleId": quoteId,
"type": "option",
"spot": false,
"margin": false,
"swap": false,
"future": false,
"option": true,
"active": true,
"contract": true,
"linear": true,
"inverse": false,
"taker": this.ParseNumber(Precise.StringDiv(takerPercent, "100")),
"maker": this.ParseNumber(Precise.StringDiv(makerPercent, "100")),
"contractSize": this.ParseNumber("1"),
"expiry": expiry,
"expiryDatetime": this.Iso8601(expiry),
"strike": strike,
"optionType": optionType,
"precision": map[string]interface{} {
"amount": this.ParseNumber("1"),
"price": this.SafeNumber(market, "order_price_round"),
},
"limits": map[string]interface{} {
"leverage": map[string]interface{} {
"min": nil,
"max": nil,
},
"amount": map[string]interface{} {
"min": this.SafeNumber(market, "order_size_min"),
"max": this.SafeNumber(market, "order_size_max"),
},
"price": map[string]interface{} {
"min": this.ParseNumber(minPrice),
"max": this.ParseNumber(maxPrice),
},
"cost": map[string]interface{} {
"min": nil,
"max": nil,
},
},
"created": this.SafeTimestamp(market, "create_time"),
"info": market,
})
}
}
ch <- result
return nil
}()
return ch
}
func (this *gate) FetchOptionUnderlyings() <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
underlyingsResponse:= (<-this.PublicOptionsGetUnderlyings())
PanicOnError(underlyingsResponse)
//
// [
// {
// "index_time": "1646915796",
// "name": "BTC_USDT",
// "index_price": "39142.73"
// }
// ]
//
var underlyings interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(underlyingsResponse)); i++ {
var underlying interface{} = GetValue(underlyingsResponse, i)
var name interface{} = this.SafeString(underlying, "name")
if IsTrue(!IsEqual(name, nil)) {
AppendToArray(&underlyings,name)
}
}
ch <- underlyings
return nil
}()
return ch
}
func (this *gate) PrepareRequest(optionalArgs ...interface{}) interface{} {
/**
* @ignore
* @method
* @name gate#prepareRequest
* @description Fills request params contract, settle, currency_pair, market and account where applicable
* @param {object} market CCXT market, required when type is undefined
* @param {string} type 'spot', 'swap', or 'future', required when market is undefined
* @param {object} [params] request parameters
* @returns the api request object, and the new params object with non-needed parameters removed
*/
// * Do not call for multi spot order methods like cancelAllOrders and fetchOpenOrders. Use multiOrderSpotPrepareRequest instead
market := GetArg(optionalArgs, 0, nil)
_ = market
typeVar := GetArg(optionalArgs, 1, nil)
_ = typeVar
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
var request interface{} = map[string]interface{} {}
if IsTrue(!IsEqual(market, nil)) {
if IsTrue(GetValue(market, "contract")) {
AddElementToObject(request, "contract", GetValue(market, "id"))
if !IsTrue(GetValue(market, "option")) {
AddElementToObject(request, "settle", GetValue(market, "settleId"))
}
} else {
AddElementToObject(request, "currency_pair", GetValue(market, "id"))
}
} else {
var swap interface{} = IsEqual(typeVar, "swap")
var future interface{} = IsEqual(typeVar, "future")
if IsTrue(IsTrue(swap) || IsTrue(future)) {
var defaultSettle interface{} = Ternary(IsTrue(swap), "usdt", "btc")
var settle interface{} = this.SafeStringLower(params, "settle", defaultSettle)
params = this.Omit(params, "settle")
AddElementToObject(request, "settle", settle)
}
}
return []interface{}{request, params}
}
func (this *gate) SpotOrderPrepareRequest(optionalArgs ...interface{}) interface{} {
/**
* @ignore
* @method
* @name gate#multiOrderSpotPrepareRequest
* @description Fills request params currency_pair, market and account where applicable for spot order methods like fetchOpenOrders, cancelAllOrders
* @param {object} market CCXT market
* @param {bool} trigger true if for a trigger order
* @param {object} [params] request parameters
* @returns the api request object, and the new params object with non-needed parameters removed
*/
market := GetArg(optionalArgs, 0, nil)
_ = market
trigger := GetArg(optionalArgs, 1, false)
_ = trigger
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
marginModequeryVariable := this.GetMarginMode(trigger, params);
marginMode := GetValue(marginModequeryVariable,0);
query := GetValue(marginModequeryVariable,1)
var request interface{} = map[string]interface{} {}
if !IsTrue(trigger) {
if IsTrue(IsEqual(market, nil)) {
panic(ArgumentsRequired(Add(this.Id, " spotOrderPrepareRequest() requires a market argument for non-trigger orders")))
}
AddElementToObject(request, "account", marginMode)
AddElementToObject(request, "currency_pair", GetValue(market, "id")) // Should always be set for non-trigger
}
return []interface{}{request, query}
}
func (this *gate) MultiOrderSpotPrepareRequest(optionalArgs ...interface{}) interface{} {
/**
* @ignore
* @method
* @name gate#multiOrderSpotPrepareRequest
* @description Fills request params currency_pair, market and account where applicable for spot order methods like fetchOpenOrders, cancelAllOrders
* @param {object} market CCXT market
* @param {bool} trigger true if for a trigger order
* @param {object} [params] request parameters
* @returns the api request object, and the new params object with non-needed parameters removed
*/
market := GetArg(optionalArgs, 0, nil)
_ = market
trigger := GetArg(optionalArgs, 1, false)
_ = trigger
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
marginModequeryVariable := this.GetMarginMode(trigger, params);
marginMode := GetValue(marginModequeryVariable,0);
query := GetValue(marginModequeryVariable,1)
var request interface{} = map[string]interface{} {
"account": marginMode,
}
if IsTrue(!IsEqual(market, nil)) {
if IsTrue(trigger) {
// gate spot and margin trigger orders use the term market instead of currency_pair, and normal instead of spot. Neither parameter is used when fetching/cancelling a single order. They are used for creating a single trigger order, but createOrder does not call this method
AddElementToObject(request, "market", GetValue(market, "id"))
} else {
AddElementToObject(request, "currency_pair", GetValue(market, "id"))
}
}
return []interface{}{request, query}
}
func (this *gate) GetMarginMode(trigger interface{}, params interface{}) interface{} {
/**
* @ignore
* @method
* @name gate#getMarginMode
* @description Gets the margin type for this api call
* @param {bool} trigger True if for a trigger order
* @param {object} [params] Request params
* @returns The marginMode and the updated request params with marginMode removed, marginMode value is the value that can be read by the "account" property specified in gates api docs
*/
var defaultMarginMode interface{} = this.SafeStringLower2(this.Options, "defaultMarginMode", "marginMode", "spot") // 'margin' is isolated margin on gate's api
var marginMode interface{} = this.SafeStringLower2(params, "marginMode", "account", defaultMarginMode)
params = this.Omit(params, []interface{}{"marginMode", "account"})
if IsTrue(IsEqual(marginMode, "cross")) {
marginMode = "cross_margin"
} else if IsTrue(IsEqual(marginMode, "isolated")) {
marginMode = "margin"
} else if IsTrue(IsEqual(marginMode, "")) {
marginMode = "spot"
}
if IsTrue(trigger) {
if IsTrue(IsEqual(marginMode, "spot")) {
// gate spot trigger orders use the term normal instead of spot
marginMode = "normal"
}
if IsTrue(IsEqual(marginMode, "cross_margin")) {
panic(BadRequest(Add(this.Id, " getMarginMode() does not support trigger orders for cross margin")))
}
}
var isUnifiedAccount interface{} = false
isUnifiedAccountparamsVariable := this.HandleOptionAndParams(params, "getMarginMode", "unifiedAccount");
isUnifiedAccount = GetValue(isUnifiedAccountparamsVariable,0);
params = GetValue(isUnifiedAccountparamsVariable,1)
if IsTrue(isUnifiedAccount) {
marginMode = "unified"
}
return []interface{}{marginMode, params}
}
func (this *gate) GetSettlementCurrencies(typeVar interface{}, method interface{}) interface{} {
var options interface{} = this.SafeValue(this.Options, typeVar, map[string]interface{} {}) // [ 'BTC', 'USDT' ] unified codes
var fetchMarketsContractOptions interface{} = this.SafeValue(options, method, map[string]interface{} {})
var defaultSettle interface{} = Ternary(IsTrue((IsEqual(typeVar, "swap"))), []interface{}{"usdt"}, []interface{}{"btc"})
return this.SafeValue(fetchMarketsContractOptions, "settlementCurrencies", defaultSettle)
}
/**
* @method
* @name gate#fetchCurrencies
* @description fetches all available currencies on an exchange
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-currencies-details
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an associative dictionary of currencies
*/
func (this *gate) FetchCurrencies(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
// sandbox/testnet only supports future markets
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
var apiBackup interface{} = this.SafeValue(this.Urls, "apiBackup")
if IsTrue(!IsEqual(apiBackup, nil)) {
return nil
}
if IsTrue(this.CheckRequiredCredentials(false)) {
retRes183412 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes183412)
}
response:= (<-this.PublicSpotGetCurrencies(params))
PanicOnError(response)
//
// [
// {
// "currency": "USDT_ETH",
// "name": "Tether",
// "delisted": false,
// "withdraw_disabled": false,
// "withdraw_delayed": false,
// "deposit_disabled": false,
// "trade_disabled": true,
// "chain": "ETH"
// },
// ]
//
var indexedCurrencies interface{} = this.IndexBy(response, "currency")
var result interface{} = map[string]interface{} {}
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var entry interface{} = GetValue(response, i)
var currencyId interface{} = this.SafeString(entry, "currency")
var parts interface{} = Split(currencyId, "_")
var partFirst interface{} = this.SafeString(parts, 0)
// if there's an underscore then the second part is always the chain name (except the _OLD suffix)
var currencyName interface{} = Ternary(IsTrue(EndsWith(currencyId, "_OLD")), currencyId, partFirst)
var withdrawEnabled interface{} = !IsTrue(this.SafeBool(entry, "withdraw_disabled"))
var depositEnabled interface{} = !IsTrue(this.SafeBool(entry, "deposit_disabled"))
var tradeDisabled interface{} = !IsTrue(this.SafeBool(entry, "trade_disabled"))
var precision interface{} = this.ParseNumber("0.0001") // temporary safe default, because no value provided from API
var code interface{} = this.SafeCurrencyCode(currencyName)
// check leveraged tokens (e.g. BTC3S, ETH5L)
var isLeveragedToken interface{} = false
if IsTrue(IsTrue(IsTrue(IsTrue(EndsWith(currencyId, "3S")) || IsTrue(EndsWith(currencyId, "3L"))) || IsTrue(EndsWith(currencyId, "5S"))) || IsTrue(EndsWith(currencyId, "5L"))) {
var realCurrencyId interface{} = Slice(currencyId, 0, OpNeg(2))
if IsTrue(InOp(indexedCurrencies, realCurrencyId)) {
isLeveragedToken = true
}
}
var typeVar interface{} = Ternary(IsTrue(isLeveragedToken), "leveraged", "crypto")
// some networks are null, they are mostly obsolete & unsupported dead tokens, so we can default their networkId to their tokenname
var networkId interface{} = this.SafeString(entry, "chain", currencyId)
var networkCode interface{} = this.NetworkIdToCode(networkId, code)
var networkEntry interface{} = map[string]interface{} {
"info": entry,
"id": networkId,
"network": networkCode,
"limits": map[string]interface{} {
"deposit": map[string]interface{} {
"min": nil,
"max": nil,
},
"withdraw": map[string]interface{} {
"min": nil,
"max": nil,
},
},
"active": !IsTrue(tradeDisabled),
"deposit": depositEnabled,
"withdraw": withdrawEnabled,
"fee": nil,
"precision": precision,
}
// check if first entry for the specific currency
if !IsTrue((InOp(result, code))) {
AddElementToObject(result, code, map[string]interface{} {
"id": currencyName,
"lowerCaseId": ToLower(currencyName),
"code": code,
"type": typeVar,
"precision": precision,
"limits": this.Limits,
"networks": map[string]interface{} {},
"info": []interface{}{},
})
}
AddElementToObject(GetValue(GetValue(result, code), "networks"), networkCode, networkEntry)
var info interface{} = this.SafeList(GetValue(result, code), "info", []interface{}{})
AppendToArray(&info,entry)
AddElementToObject(GetValue(result, code), "info", info)
AddElementToObject(result, code, this.SafeCurrencyStructure(GetValue(result, code))) // this is needed after adding network entry
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchFundingRate
* @description fetch the current funding rate
* @see https://www.gate.io/docs/developers/apiv4/en/#get-a-single-contract
* @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 *gate) 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
retRes19298 := (<-this.LoadMarkets())
PanicOnError(retRes19298)
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "swap")) {
panic(BadSymbol(Add(this.Id, " fetchFundingRate() supports swap contracts only")))
}
requestqueryVariable := this.PrepareRequest(market, nil, params);
request := GetValue(requestqueryVariable,0);
query := GetValue(requestqueryVariable,1)
response:= (<-this.PublicFuturesGetSettleContractsContract(this.Extend(request, query)))
PanicOnError(response)
//
// [
// {
// "name": "BTC_USDT",
// "type": "direct",
// "quanto_multiplier": "0.0001",
// "ref_discount_rate": "0",
// "order_price_deviate": "0.5",
// "maintenance_rate": "0.005",
// "mark_type": "index",
// "last_price": "38026",
// "mark_price": "37985.6",
// "index_price": "37954.92",
// "funding_rate_indicative": "0.000219",
// "mark_price_round": "0.01",
// "funding_offset": 0,
// "in_delisting": false,
// "risk_limit_base": "1000000",
// "interest_rate": "0.0003",
// "order_price_round": "0.1",
// "order_size_min": 1,
// "ref_rebate_rate": "0.2",
// "funding_interval": 28800,
// "risk_limit_step": "1000000",
// "leverage_min": "1",
// "leverage_max": "100",
// "risk_limit_max": "8000000",
// "maker_fee_rate": "-0.00025",
// "taker_fee_rate": "0.00075",
// "funding_rate": "0.002053",
// "order_size_max": 1000000,
// "funding_next_apply": 1610035200,
// "short_users": 977,
// "config_change_time": 1609899548,
// "trade_size": 28530850594,
// "position_size": 5223816,
// "long_users": 455,
// "funding_impact_value": "60000",
// "orders_limit": 50,
// "trade_id": 10851092,
// "orderbook_id": 2129638396
// }
// ]
//
ch <- this.ParseFundingRate(response)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchFundingRates
* @description fetch the funding rate for multiple markets
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts
* @param {string[]|undefined} symbols list of unified market symbols
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} a list of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rates-structure}, indexed by market symbols
*/
func (this *gate) 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
retRes19938 := (<-this.LoadMarkets())
PanicOnError(retRes19938)
symbols = this.MarketSymbols(symbols)
requestqueryVariable := this.PrepareRequest(nil, "swap", params);
request := GetValue(requestqueryVariable,0);
query := GetValue(requestqueryVariable,1)
response:= (<-this.PublicFuturesGetSettleContracts(this.Extend(request, query)))
PanicOnError(response)
//
// [
// {
// "name": "BTC_USDT",
// "type": "direct",
// "quanto_multiplier": "0.0001",
// "ref_discount_rate": "0",
// "order_price_deviate": "0.5",
// "maintenance_rate": "0.005",
// "mark_type": "index",
// "last_price": "38026",
// "mark_price": "37985.6",
// "index_price": "37954.92",
// "funding_rate_indicative": "0.000219",
// "mark_price_round": "0.01",
// "funding_offset": 0,
// "in_delisting": false,
// "risk_limit_base": "1000000",
// "interest_rate": "0.0003",
// "order_price_round": "0.1",
// "order_size_min": 1,
// "ref_rebate_rate": "0.2",
// "funding_interval": 28800,
// "risk_limit_step": "1000000",
// "leverage_min": "1",
// "leverage_max": "100",
// "risk_limit_max": "8000000",
// "maker_fee_rate": "-0.00025",
// "taker_fee_rate": "0.00075",
// "funding_rate": "0.002053",
// "order_size_max": 1000000,
// "funding_next_apply": 1610035200,
// "short_users": 977,
// "config_change_time": 1609899548,
// "trade_size": 28530850594,
// "position_size": 5223816,
// "long_users": 455,
// "funding_impact_value": "60000",
// "orders_limit": 50,
// "trade_id": 10851092,
// "orderbook_id": 2129638396
// }
// ]
//
ch <- this.ParseFundingRates(response, symbols)
return nil
}()
return ch
}
func (this *gate) ParseFundingRate(contract interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "name": "BTC_USDT",
// "type": "direct",
// "quanto_multiplier": "0.0001",
// "ref_discount_rate": "0",
// "order_price_deviate": "0.5",
// "maintenance_rate": "0.005",
// "mark_type": "index",
// "last_price": "38026",
// "mark_price": "37985.6",
// "index_price": "37954.92",
// "funding_rate_indicative": "0.000219",
// "mark_price_round": "0.01",
// "funding_offset": 0,
// "in_delisting": false,
// "risk_limit_base": "1000000",
// "interest_rate": "0.0003",
// "order_price_round": "0.1",
// "order_size_min": 1,
// "ref_rebate_rate": "0.2",
// "funding_interval": 28800,
// "risk_limit_step": "1000000",
// "leverage_min": "1",
// "leverage_max": "100",
// "risk_limit_max": "8000000",
// "maker_fee_rate": "-0.00025",
// "taker_fee_rate": "0.00075",
// "funding_rate": "0.002053",
// "order_size_max": 1000000,
// "funding_next_apply": 1610035200,
// "short_users": 977,
// "config_change_time": 1609899548,
// "trade_size": 28530850594,
// "position_size": 5223816,
// "long_users": 455,
// "funding_impact_value": "60000",
// "orders_limit": 50,
// "trade_id": 10851092,
// "orderbook_id": 2129638396
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(contract, "name")
var symbol interface{} = this.SafeSymbol(marketId, market, "_", "swap")
var markPrice interface{} = this.SafeNumber(contract, "mark_price")
var indexPrice interface{} = this.SafeNumber(contract, "index_price")
var interestRate interface{} = this.SafeNumber(contract, "interest_rate")
var fundingRate interface{} = this.SafeNumber(contract, "funding_rate")
var fundingTime interface{} = this.SafeTimestamp(contract, "funding_next_apply")
var fundingRateIndicative interface{} = this.SafeNumber(contract, "funding_rate_indicative")
var fundingInterval interface{} = Precise.StringMul("1000", this.SafeString(contract, "funding_interval"))
return map[string]interface{} {
"info": contract,
"symbol": symbol,
"markPrice": markPrice,
"indexPrice": indexPrice,
"interestRate": interestRate,
"estimatedSettlePrice": nil,
"timestamp": nil,
"datetime": nil,
"fundingRate": fundingRate,
"fundingTimestamp": fundingTime,
"fundingDatetime": this.Iso8601(fundingTime),
"nextFundingRate": fundingRateIndicative,
"nextFundingTimestamp": nil,
"nextFundingDatetime": nil,
"previousFundingRate": nil,
"previousFundingTimestamp": nil,
"previousFundingDatetime": nil,
"interval": this.ParseFundingInterval(fundingInterval),
}
}
func (this *gate) ParseFundingInterval(interval interface{}) interface{} {
var intervals interface{} = map[string]interface{} {
"3600000": "1h",
"14400000": "4h",
"28800000": "8h",
"57600000": "16h",
"86400000": "24h",
}
return this.SafeString(intervals, interval, interval)
}
func (this *gate) FetchNetworkDepositAddress(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
retRes21308 := (<-this.LoadMarkets())
PanicOnError(retRes21308)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"currency": GetValue(currency, "id"),
}
response:= (<-this.PrivateWalletGetDepositAddress(this.Extend(request, params)))
PanicOnError(response)
var addresses interface{} = this.SafeValue(response, "multichain_addresses")
var currencyId interface{} = this.SafeString(response, "currency")
code = this.SafeCurrencyCode(currencyId)
var result interface{} = map[string]interface{} {}
for i := 0; IsLessThan(i, GetArrayLength(addresses)); i++ {
var entry interface{} = GetValue(addresses, i)
//
// {
// "chain": "ETH",
// "address": "0x359a697945E79C7e17b634675BD73B33324E9408",
// "payment_id": "",
// "payment_name": "",
// "obtain_failed": "0"
// }
//
var obtainFailed interface{} = this.SafeInteger(entry, "obtain_failed")
if IsTrue(obtainFailed) {
continue
}
var network interface{} = this.SafeString(entry, "chain")
var address interface{} = this.SafeString(entry, "address")
var tag interface{} = this.SafeString(entry, "payment_id")
AddElementToObject(result, network, map[string]interface{} {
"info": entry,
"code": code,
"currency": code,
"address": address,
"tag": tag,
})
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchDepositAddressesByNetwork
* @description fetch a dictionary of addresses for a currency, indexed by network
* @param {string} code unified currency code of the currency for the deposit address
* @param {object} [params] extra parameters specific to the api endpoint
* @returns {object} a dictionary of [address structures]{@link https://docs.ccxt.com/#/?id=address-structure} indexed by the network
*/
func (this *gate) FetchDepositAddressesByNetwork(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
retRes21788 := (<-this.LoadMarkets())
PanicOnError(retRes21788)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"currency": GetValue(currency, "id"),
}
response:= (<-this.PrivateWalletGetDepositAddress(this.Extend(request, params)))
PanicOnError(response)
var chains interface{} = this.SafeValue(response, "multichain_addresses", []interface{}{})
var currencyId interface{} = this.SafeString(response, "currency")
currency = this.SafeCurrency(currencyId, currency)
var parsed interface{} = this.ParseDepositAddresses(chains, []interface{}{GetValue(currency, "code")}, false, map[string]interface{} {
"currency": GetValue(currency, "id"),
})
ch <- this.IndexBy(parsed, "network")
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchDepositAddress
* @description fetch the deposit address for a currency associated with this account
* @see https://www.gate.io/docs/developers/apiv4/en/#generate-currency-deposit-address
* @param {string} code unified currency code
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.network] unified network code (not used directly by gate.io but used by ccxt to filter the response)
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
*/
func (this *gate) 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
retRes22048 := (<-this.LoadMarkets())
PanicOnError(retRes22048)
var networkCode interface{} = nil
networkCodeparamsVariable := this.HandleNetworkCodeAndParams(params);
networkCode = GetValue(networkCodeparamsVariable,0);
params = GetValue(networkCodeparamsVariable,1)
chainsIndexedById:= (<-this.FetchDepositAddressesByNetwork(code, params))
PanicOnError(chainsIndexedById)
var selectedNetworkId interface{} = this.SelectNetworkCodeFromUnifiedNetworks(code, networkCode, chainsIndexedById)
ch <- GetValue(chainsIndexedById, selectedNetworkId)
return nil
}()
return ch
}
func (this *gate) ParseDepositAddress(depositAddress interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// chain: "BTC",
// address: "1Nxu.......Ys",
// payment_id: "",
// payment_name: "",
// obtain_failed: "0",
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var address interface{} = this.SafeString(depositAddress, "address")
this.CheckAddress(address)
return map[string]interface{} {
"info": depositAddress,
"currency": this.SafeString(currency, "code"),
"address": address,
"tag": this.SafeString(depositAddress, "payment_id"),
"network": this.NetworkIdToCode(this.SafeString(depositAddress, "chain")),
}
}
/**
* @method
* @name gate#fetchTradingFee
* @description fetch the trading fees for a market
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-personal-trading-fee
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [fee structure]{@link https://docs.ccxt.com/#/?id=fee-structure}
*/
func (this *gate) 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
retRes22438 := (<-this.LoadMarkets())
PanicOnError(retRes22438)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"currency_pair": GetValue(market, "id"),
}
response:= (<-this.PrivateWalletGetFee(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "user_id": 1486602,
// "taker_fee": "0.002",
// "maker_fee": "0.002",
// "gt_discount": true,
// "gt_taker_fee": "0.0015",
// "gt_maker_fee": "0.0015",
// "loan_fee": "0.18",
// "point_type": "0",
// "futures_taker_fee": "0.0005",
// "futures_maker_fee": "0"
// }
//
ch <- this.ParseTradingFee(response, market)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchTradingFees
* @description fetch the trading fees for multiple markets
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-personal-trading-fee
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols
*/
func (this *gate) 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
retRes22758 := (<-this.LoadMarkets())
PanicOnError(retRes22758)
response:= (<-this.PrivateWalletGetFee(params))
PanicOnError(response)
//
// {
// "user_id": 1486602,
// "taker_fee": "0.002",
// "maker_fee": "0.002",
// "gt_discount": true,
// "gt_taker_fee": "0.0015",
// "gt_maker_fee": "0.0015",
// "loan_fee": "0.18",
// "point_type": "0",
// "futures_taker_fee": "0.0005",
// "futures_maker_fee": "0"
// }
//
ch <- this.ParseTradingFees(response)
return nil
}()
return ch
}
func (this *gate) ParseTradingFees(response interface{}) interface{} {
var result interface{} = map[string]interface{} {}
for i := 0; IsLessThan(i, GetArrayLength(this.Symbols)); i++ {
var symbol interface{} = GetValue(this.Symbols, i)
var market interface{} = this.Market(symbol)
AddElementToObject(result, symbol, this.ParseTradingFee(response, market))
}
return result
}
func (this *gate) ParseTradingFee(info interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "user_id": 1486602,
// "taker_fee": "0.002",
// "maker_fee": "0.002",
// "gt_discount": true,
// "gt_taker_fee": "0.0015",
// "gt_maker_fee": "0.0015",
// "loan_fee": "0.18",
// "point_type": "0",
// "futures_taker_fee": "0.0005",
// "futures_maker_fee": "0"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var gtDiscount interface{} = this.SafeValue(info, "gt_discount")
var taker interface{} = Ternary(IsTrue(gtDiscount), "gt_taker_fee", "taker_fee")
var maker interface{} = Ternary(IsTrue(gtDiscount), "gt_maker_fee", "maker_fee")
var contract interface{} = this.SafeValue(market, "contract")
var takerKey interface{} = Ternary(IsTrue(contract), "futures_taker_fee", taker)
var makerKey interface{} = Ternary(IsTrue(contract), "futures_maker_fee", maker)
return map[string]interface{} {
"info": info,
"symbol": this.SafeString(market, "symbol"),
"maker": this.SafeNumber(info, makerKey),
"taker": this.SafeNumber(info, takerKey),
"percentage": nil,
"tierBased": nil,
}
}
/**
* @method
* @name gate#fetchTransactionFees
* @deprecated
* @description please use fetchDepositWithdrawFees instead
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-withdrawal-status
* @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 *gate) FetchTransactionFees(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
retRes23468 := (<-this.LoadMarkets())
PanicOnError(retRes23468)
response:= (<-this.PrivateWalletGetWithdrawStatus(params))
PanicOnError(response)
//
// {
// "currency": "MTN",
// "name": "Medicalchain",
// "name_cn": "Medicalchain",
// "deposit": "0",
// "withdraw_percent": "0%",
// "withdraw_fix": "900",
// "withdraw_day_limit": "500000",
// "withdraw_day_limit_remain": "500000",
// "withdraw_amount_mini": "900.1",
// "withdraw_eachtime_limit": "90000000000",
// "withdraw_fix_on_chains": {
// "ETH": "900"
// }
// }
//
var result interface{} = map[string]interface{} {}
var withdrawFees interface{} = map[string]interface{} {}
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
withdrawFees = map[string]interface{} {}
var entry interface{} = GetValue(response, i)
var currencyId interface{} = this.SafeString(entry, "currency")
var code interface{} = this.SafeCurrencyCode(currencyId)
if IsTrue(IsTrue((!IsEqual(codes, nil))) && !IsTrue(this.InArray(code, codes))) {
continue
}
var withdrawFixOnChains interface{} = this.SafeValue(entry, "withdraw_fix_on_chains")
if IsTrue(IsEqual(withdrawFixOnChains, nil)) {
withdrawFees = this.SafeNumber(entry, "withdraw_fix")
} else {
var chainKeys interface{} = ObjectKeys(withdrawFixOnChains)
for j := 0; IsLessThan(j, GetArrayLength(chainKeys)); j++ {
var chainKey interface{} = GetValue(chainKeys, j)
AddElementToObject(withdrawFees, chainKey, this.ParseNumber(GetValue(withdrawFixOnChains, chainKey)))
}
}
AddElementToObject(result, code, map[string]interface{} {
"withdraw": withdrawFees,
"deposit": nil,
"info": entry,
})
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchDepositWithdrawFees
* @description fetch deposit and withdraw fees
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-withdrawal-status
* @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 *gate) 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
retRes24048 := (<-this.LoadMarkets())
PanicOnError(retRes24048)
response:= (<-this.PrivateWalletGetWithdrawStatus(params))
PanicOnError(response)
//
// [
// {
// "currency": "MTN",
// "name": "Medicalchain",
// "name_cn": "Medicalchain",
// "deposit": "0",
// "withdraw_percent": "0%",
// "withdraw_fix": "900",
// "withdraw_day_limit": "500000",
// "withdraw_day_limit_remain": "500000",
// "withdraw_amount_mini": "900.1",
// "withdraw_eachtime_limit": "90000000000",
// "withdraw_fix_on_chains": {
// "ETH": "900"
// }
// }
// ]
//
ch <- this.ParseDepositWithdrawFees(response, codes, "currency")
return nil
}()
return ch
}
func (this *gate) ParseDepositWithdrawFee(fee interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "currency": "MTN",
// "name": "Medicalchain",
// "name_cn": "Medicalchain",
// "deposit": "0",
// "withdraw_percent": "0%",
// "withdraw_fix": "900",
// "withdraw_day_limit": "500000",
// "withdraw_day_limit_remain": "500000",
// "withdraw_amount_mini": "900.1",
// "withdraw_eachtime_limit": "90000000000",
// "withdraw_fix_on_chains": {
// "ETH": "900"
// }
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var withdrawFixOnChains interface{} = this.SafeValue(fee, "withdraw_fix_on_chains")
var result interface{} = map[string]interface{} {
"info": fee,
"withdraw": map[string]interface{} {
"fee": this.SafeNumber(fee, "withdraw_fix"),
"percentage": false,
},
"deposit": map[string]interface{} {
"fee": this.SafeNumber(fee, "deposit"),
"percentage": false,
},
"networks": map[string]interface{} {},
}
if IsTrue(!IsEqual(withdrawFixOnChains, nil)) {
var chainKeys interface{} = ObjectKeys(withdrawFixOnChains)
for i := 0; IsLessThan(i, GetArrayLength(chainKeys)); i++ {
var chainKey interface{} = GetValue(chainKeys, i)
var networkCode interface{} = this.NetworkIdToCode(chainKey, this.SafeString(fee, "currency"))
AddElementToObject(GetValue(result, "networks"), networkCode, map[string]interface{} {
"withdraw": map[string]interface{} {
"fee": this.ParseNumber(GetValue(withdrawFixOnChains, chainKey)),
"percentage": false,
},
"deposit": map[string]interface{} {
"fee": nil,
"percentage": nil,
},
})
}
}
return result
}
/**
* @method
* @name gate#fetchFundingHistory
* @description fetch the history of funding payments paid and received on this account
* @see https://www.gate.io/docs/developers/apiv4/en/#query-account-book-2
* @see https://www.gate.io/docs/developers/apiv4/en/#query-account-book-3
* @param {string} symbol unified market symbol
* @param {int} [since] the earliest time in ms to fetch funding history for
* @param {int} [limit] the maximum number of funding history structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [funding history structure]{@link https://docs.ccxt.com/#/?id=funding-history-structure}
*/
func (this *gate) 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
retRes24928 := (<-this.LoadMarkets())
PanicOnError(retRes24928)
// let defaultType = 'future';
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
symbol = GetValue(market, "symbol")
}
typeVarqueryVariable := this.HandleMarketTypeAndParams("fetchFundingHistory", market, params);
typeVar := GetValue(typeVarqueryVariable,0);
query := GetValue(typeVarqueryVariable,1)
requestrequestParamsVariable := this.PrepareRequest(market, typeVar, query);
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
AddElementToObject(request, "type", "fund") // 'dnw' 'pnl' 'fee' 'refr' 'fund' 'point_dnw' 'point_fee' 'point_refr'
if IsTrue(!IsEqual(since, nil)) {
// from should be integer
AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var response interface{} = nil
if IsTrue(IsEqual(typeVar, "swap")) {
response = (<-this.PrivateFuturesGetSettleAccountBook(this.Extend(request, requestParams)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "future")) {
response = (<-this.PrivateDeliveryGetSettleAccountBook(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchFundingHistory() only support swap & future market type")))
}
//
// [
// {
// "time": 1646899200,
// "change": "-0.027722",
// "balance": "11.653120591841",
// "text": "XRP_USDT",
// "type": "fund"
// },
// ...
// ]
//
ch <- this.ParseFundingHistories(response, symbol, since, limit)
return nil
}()
return ch
}
func (this *gate) ParseFundingHistories(response interface{}, symbol interface{}, since interface{}, limit interface{}) interface{} {
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var entry interface{} = GetValue(response, i)
var funding interface{} = this.ParseFundingHistory(entry)
AppendToArray(&result,funding)
}
var sorted interface{} = this.SortBy(result, "timestamp")
return this.FilterBySymbolSinceLimit(sorted, symbol, since, limit)
}
func (this *gate) ParseFundingHistory(info interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "time": 1646899200,
// "change": "-0.027722",
// "balance": "11.653120591841",
// "text": "XRP_USDT",
// "type": "fund"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var timestamp interface{} = this.SafeTimestamp(info, "time")
var marketId interface{} = this.SafeString(info, "text")
market = this.SafeMarket(marketId, market, "_", "swap")
return map[string]interface{} {
"info": info,
"symbol": this.SafeString(market, "symbol"),
"code": this.SafeString(market, "settle"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"id": nil,
"amount": this.SafeNumber(info, "change"),
}
}
/**
* @method
* @name gate#fetchOrderBook
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-order-book
* @see https://www.gate.io/docs/developers/apiv4/en/#futures-order-book
* @see https://www.gate.io/docs/developers/apiv4/en/#futures-order-book-2
* @see https://www.gate.io/docs/developers/apiv4/en/#options-order-book
* @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 *gate) 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
retRes25818 := (<-this.LoadMarkets())
PanicOnError(retRes25818)
var market interface{} = this.Market(symbol)
//
// const request: Dict = {
// 'currency_pair': market['id'],
// 'interval': '0', // depth, 0 means no aggregation is applied, default to 0
// 'limit': limit, // maximum number of order depth data in asks or bids
// 'with_id': true, // return order book ID
// };
//
requestqueryVariable := this.PrepareRequest(market, GetValue(market, "type"), params);
request := GetValue(requestqueryVariable,0);
query := GetValue(requestqueryVariable,1)
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit) // default 10, max 100
}
AddElementToObject(request, "with_id", true)
var response interface{} = nil
if IsTrue(IsTrue(GetValue(market, "spot")) || IsTrue(GetValue(market, "margin"))) {
response = (<-this.PublicSpotGetOrderBook(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "swap")) {
response = (<-this.PublicFuturesGetSettleOrderBook(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "future")) {
response = (<-this.PublicDeliveryGetSettleOrderBook(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "option")) {
response = (<-this.PublicOptionsGetOrderBook(this.Extend(request, query)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchOrderBook() not support this market type")))
}
//
// spot
//
// {
// "id": 6358770031
// "current": 1634345973275,
// "update": 1634345973271,
// "asks": [
// ["2.2241","12449.827"],
// ["2.2242","200"],
// ["2.2244","826.931"],
// ["2.2248","3876.107"],
// ["2.225","2377.252"],
// ["2.22509","439.484"],
// ["2.2251","1489.313"],
// ["2.2253","714.582"],
// ["2.2254","1349.784"],
// ["2.2256","234.701"]],
// "bids": [
// ["2.2236","32.465"],
// ["2.2232","243.983"],
// ["2.2231","32.207"],
// ["2.223","449.827"],
// ["2.2228","7.918"],
// ["2.2227","12703.482"],
// ["2.2226","143.033"],
// ["2.2225","143.027"],
// ["2.2224","1369.352"],
// ["2.2223","756.063"]
// ]
// }
//
// swap, future and option
//
// {
// "id": 6358770031
// "current": 1634350208.745,
// "asks": [
// {"s": 24909, "p": "61264.8"},
// {"s": 81, "p": "61266.6"},
// {"s": 2000, "p": "61267.6"},
// {"s": 490, "p": "61270.2"},
// {"s": 12, "p": "61270.4"},
// {"s": 11782, "p": "61273.2"},
// {"s": 14666, "p": "61273.3"},
// {"s": 22541, "p": "61273.4"},
// {"s": 33, "p": "61273.6"},
// {"s": 11980, "p": "61274.5"}
// ],
// "bids": [
// {"s": 41844, "p": "61264.7"},
// {"s": 13783, "p": "61263.3"},
// {"s": 1143, "p": "61259.8"},
// {"s": 81, "p": "61258.7"},
// {"s": 2471, "p": "61257.8"},
// {"s": 2471, "p": "61257.7"},
// {"s": 2471, "p": "61256.5"},
// {"s": 3, "p": "61254.2"},
// {"s": 114, "p": "61252.4"},
// {"s": 14372, "p": "61248.6"}
// ],
// "update": 1634350208.724
// }
//
var timestamp interface{} = this.SafeInteger(response, "current")
if !IsTrue(GetValue(market, "spot")) {
timestamp = Multiply(timestamp, 1000)
}
var priceKey interface{} = Ternary(IsTrue(GetValue(market, "spot")), 0, "p")
var amountKey interface{} = Ternary(IsTrue(GetValue(market, "spot")), 1, "s")
var nonce interface{} = this.SafeInteger(response, "id")
var result interface{} = this.ParseOrderBook(response, symbol, timestamp, "bids", "asks", priceKey, amountKey)
AddElementToObject(result, "nonce", nonce)
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name gate#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.gate.io/docs/developers/apiv4/en/#get-details-of-a-specifc-order
* @see https://www.gate.io/docs/developers/apiv4/en/#list-futures-tickers
* @see https://www.gate.io/docs/developers/apiv4/en/#list-futures-tickers-2
* @see https://www.gate.io/docs/developers/apiv4/en/#list-tickers-of-options-contracts
* @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 *gate) 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
retRes26978 := (<-this.LoadMarkets())
PanicOnError(retRes26978)
var market interface{} = this.Market(symbol)
requestqueryVariable := this.PrepareRequest(market, nil, params);
request := GetValue(requestqueryVariable,0);
query := GetValue(requestqueryVariable,1)
var response interface{} = nil
if IsTrue(IsTrue(GetValue(market, "spot")) || IsTrue(GetValue(market, "margin"))) {
response = (<-this.PublicSpotGetTickers(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "swap")) {
response = (<-this.PublicFuturesGetSettleTickers(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "future")) {
response = (<-this.PublicDeliveryGetSettleTickers(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "option")) {
var marketId interface{} = GetValue(market, "id")
var optionParts interface{} = Split(marketId, "-")
AddElementToObject(request, "underlying", this.SafeString(optionParts, 0))
response = (<-this.PublicOptionsGetTickers(this.Extend(request, query)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchTicker() not support this market type")))
}
var ticker interface{} = nil
if IsTrue(GetValue(market, "option")) {
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var entry interface{} = GetValue(response, i)
if IsTrue(IsEqual(GetValue(entry, "name"), GetValue(market, "id"))) {
ticker = entry
break
}
}
} else {
ticker = this.SafeValue(response, 0)
}
ch <- this.ParseTicker(ticker, market)
return nil
}()
return ch
}
func (this *gate) ParseTicker(ticker interface{}, optionalArgs ...interface{}) interface{} {
//
// SPOT
//
// {
// "currency_pair": "KFC_USDT",
// "last": "7.255",
// "lowest_ask": "7.298",
// "highest_bid": "7.218",
// "change_percentage": "-1.18",
// "base_volume": "1219.053687865",
// "quote_volume": "8807.40299875455",
// "high_24h": "7.262",
// "low_24h": "7.095"
// }
//
// LINEAR/DELIVERY
//
// {
// "contract": "BTC_USDT",
// "last": "6432",
// "low_24h": "6278",
// "high_24h": "6790",
// "change_percentage": "4.43",
// "total_size": "32323904",
// "volume_24h": "184040233284",
// "volume_24h_btc": "28613220",
// "volume_24h_usd": "184040233284",
// "volume_24h_base": "28613220",
// "volume_24h_quote": "184040233284",
// "volume_24h_settle": "28613220",
// "mark_price": "6534",
// "funding_rate": "0.0001",
// "funding_rate_indicative": "0.0001",
// "index_price": "6531"
// }
//
// bookTicker
// {
// "t": 1671363004228,
// "u": 9793320464,
// "s": "BTC_USDT",
// "b": "16716.8", // best bid price
// "B": "0.0134", // best bid size
// "a": "16716.9", // best ask price
// "A": "0.0353" // best ask size
// }
//
// option
//
// {
// "vega": "0.00002",
// "leverage": "12.277188268663",
// "ask_iv": "0",
// "delta": "-0.99999",
// "last_price": "0",
// "theta": "-0.00661",
// "bid1_price": "1096",
// "mark_iv": "0.7799",
// "name": "BTC_USDT-20230608-28500-P",
// "bid_iv": "0",
// "ask1_price": "2935",
// "mark_price": "2147.3",
// "position_size": 0,
// "bid1_size": 12,
// "ask1_size": -14,
// "gamma": "0"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeStringN(ticker, []interface{}{"currency_pair", "contract", "name"})
var marketType interface{} = Ternary(IsTrue((InOp(ticker, "mark_price"))), "contract", "spot")
var symbol interface{} = this.SafeSymbol(marketId, market, "_", marketType)
var last interface{} = this.SafeString2(ticker, "last", "last_price")
var ask interface{} = this.SafeStringN(ticker, []interface{}{"lowest_ask", "a", "ask1_price"})
var bid interface{} = this.SafeStringN(ticker, []interface{}{"highest_bid", "b", "bid1_price"})
var high interface{} = this.SafeString(ticker, "high_24h")
var low interface{} = this.SafeString(ticker, "low_24h")
var bidVolume interface{} = this.SafeString2(ticker, "B", "bid1_size")
var askVolume interface{} = this.SafeString2(ticker, "A", "ask1_size")
var timestamp interface{} = this.SafeInteger(ticker, "t")
var baseVolume interface{} = this.SafeString2(ticker, "base_volume", "volume_24h_base")
if IsTrue(IsEqual(baseVolume, "nan")) {
baseVolume = "0"
}
var quoteVolume interface{} = this.SafeString2(ticker, "quote_volume", "volume_24h_quote")
if IsTrue(IsEqual(quoteVolume, "nan")) {
quoteVolume = "0"
}
var percentage interface{} = this.SafeString(ticker, "change_percentage")
return this.SafeTicker(map[string]interface{} {
"symbol": symbol,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"high": high,
"low": low,
"bid": bid,
"bidVolume": bidVolume,
"ask": ask,
"askVolume": askVolume,
"vwap": nil,
"open": nil,
"close": last,
"last": last,
"previousClose": nil,
"change": nil,
"percentage": percentage,
"average": nil,
"baseVolume": baseVolume,
"quoteVolume": quoteVolume,
"markPrice": this.SafeString(ticker, "mark_price"),
"indexPrice": this.SafeString(ticker, "index_price"),
"info": ticker,
}, market)
}
/**
* @method
* @name gate#fetchTickers
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
* @see https://www.gate.io/docs/developers/apiv4/en/#get-details-of-a-specifc-order
* @see https://www.gate.io/docs/developers/apiv4/en/#list-futures-tickers
* @see https://www.gate.io/docs/developers/apiv4/en/#list-futures-tickers-2
* @see https://www.gate.io/docs/developers/apiv4/en/#list-tickers-of-options-contracts
* @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
* @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
*/
func (this *gate) 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
retRes28588 := (<-this.LoadMarkets())
PanicOnError(retRes28588)
symbols = this.MarketSymbols(symbols)
var first interface{} = this.SafeString(symbols, 0)
var market interface{} = nil
if IsTrue(!IsEqual(first, nil)) {
market = this.Market(first)
}
typeVarqueryVariable := this.HandleMarketTypeAndParams("fetchTickers", market, params);
typeVar := GetValue(typeVarqueryVariable,0);
query := GetValue(typeVarqueryVariable,1)
requestrequestParamsVariable := this.PrepareRequest(nil, typeVar, query);
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
var response interface{} = nil
AddElementToObject(request, "timezone", "utc0") // default to utc
if IsTrue(IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "margin"))) {
response = (<-this.PublicSpotGetTickers(this.Extend(request, requestParams)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "swap")) {
response = (<-this.PublicFuturesGetSettleTickers(this.Extend(request, requestParams)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "future")) {
response = (<-this.PublicDeliveryGetSettleTickers(this.Extend(request, requestParams)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "option")) {
this.CheckRequiredArgument("fetchTickers", symbols, "symbols")
var marketId interface{} = GetValue(market, "id")
var optionParts interface{} = Split(marketId, "-")
AddElementToObject(request, "underlying", this.SafeString(optionParts, 0))
response = (<-this.PublicOptionsGetTickers(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchTickers() not support this market type, provide symbols or set params[\"defaultType\"] to one from spot/margin/swap/future/option")))
}
ch <- this.ParseTickers(response, symbols)
return nil
}()
return ch
}
func (this *gate) ParseBalanceHelper(entry interface{}) interface{} {
var account interface{} = this.Account()
AddElementToObject(account, "used", this.SafeString2(entry, "freeze", "locked"))
AddElementToObject(account, "free", this.SafeString(entry, "available"))
AddElementToObject(account, "total", this.SafeString(entry, "total"))
if IsTrue(InOp(entry, "borrowed")) {
AddElementToObject(account, "debt", this.SafeString(entry, "borrowed"))
}
return account
}
/**
* @method
* @name gate#fetchBalance
* @param {object} [params] exchange specific parameters
* @param {string} [params.type] spot, margin, swap or future, if not provided this.options['defaultType'] is used
* @param {string} [params.settle] 'btc' or 'usdt' - settle currency for perpetual swap and future - default="usdt" for swap and "btc" for future
* @param {string} [params.marginMode] 'cross' or 'isolated' - marginMode for margin trading if not provided this.options['defaultMarginMode'] is used
* @param {string} [params.symbol] margin only - unified ccxt symbol
* @param {boolean} [params.unifiedAccount] default false, set to true for fetching the unified account balance
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
*/
func (this *gate) 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
retRes29108 := (<-this.LoadMarkets())
PanicOnError(retRes29108)
retRes29118 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes29118)
var symbol interface{} = this.SafeString(params, "symbol")
params = this.Omit(params, "symbol")
var isUnifiedAccount interface{} = false
isUnifiedAccountparamsVariable := this.HandleOptionAndParams(params, "fetchBalance", "unifiedAccount");
isUnifiedAccount = GetValue(isUnifiedAccountparamsVariable,0);
params = GetValue(isUnifiedAccountparamsVariable,1)
typeVarqueryVariable := this.HandleMarketTypeAndParams("fetchBalance", nil, params);
typeVar := GetValue(typeVarqueryVariable,0);
query := GetValue(typeVarqueryVariable,1)
requestrequestParamsVariable := this.PrepareRequest(nil, typeVar, query);
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
marginModerequestQueryVariable := this.GetMarginMode(false, requestParams);
marginMode := GetValue(marginModerequestQueryVariable,0);
requestQuery := GetValue(marginModerequestQueryVariable,1)
if IsTrue(!IsEqual(symbol, nil)) {
var market interface{} = this.Market(symbol)
AddElementToObject(request, "currency_pair", GetValue(market, "id"))
}
var response interface{} = nil
if IsTrue(isUnifiedAccount) {
response = (<-this.PrivateUnifiedGetAccounts(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "spot")) {
if IsTrue(IsEqual(marginMode, "spot")) {
response = (<-this.PrivateSpotGetAccounts(this.Extend(request, requestQuery)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "margin")) {
response = (<-this.PrivateMarginGetAccounts(this.Extend(request, requestQuery)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross_margin")) {
response = (<-this.PrivateMarginGetCrossAccounts(this.Extend(request, requestQuery)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchBalance() not support this marginMode")))
}
} else if IsTrue(IsEqual(typeVar, "funding")) {
response = (<-this.PrivateMarginGetFundingAccounts(this.Extend(request, requestQuery)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "swap")) {
response = (<-this.PrivateFuturesGetSettleAccounts(this.Extend(request, requestQuery)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "future")) {
response = (<-this.PrivateDeliveryGetSettleAccounts(this.Extend(request, requestQuery)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "option")) {
response = (<-this.PrivateOptionsGetAccounts(this.Extend(request, requestQuery)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchBalance() not support this market type")))
}
var contract interface{} = (IsTrue(IsTrue((IsEqual(typeVar, "swap"))) || IsTrue((IsEqual(typeVar, "future")))) || IsTrue((IsEqual(typeVar, "option"))))
if IsTrue(contract) {
response = []interface{}{response}
}
//
// Spot / margin funding
//
// [
// {
// "currency": "DBC",
// "available": "0",
// "locked": "0"
// "lent": "0", // margin funding only
// "total_lent": "0" // margin funding only
// },
// ...
// ]
//
// Margin
//
// [
// {
// "currency_pair": "DOGE_USDT",
// "locked": false,
// "risk": "9999.99",
// "base": {
// "currency": "DOGE",
// "available": "0",
// "locked": "0",
// "borrowed": "0",
// "interest": "0"
// },
// "quote": {
// "currency": "USDT",
// "available": "0.73402",
// "locked": "0",
// "borrowed": "0",
// "interest": "0"
// }
// },
// ...
// ]
//
// Cross margin
//
// {
// "user_id": 10406147,
// "locked": false,
// "balances": {
// "USDT": {
// "available": "1",
// "freeze": "0",
// "borrowed": "0",
// "interest": "0"
// }
// },
// "total": "1",
// "borrowed": "0",
// "interest": "0",
// "risk": "9999.99"
// }
//
// Perpetual Swap
//
// {
// "order_margin": "0",
// "point": "0",
// "bonus": "0",
// "history": {
// "dnw": "2.1321",
// "pnl": "11.5351",
// "refr": "0",
// "point_fee": "0",
// "fund": "-0.32340576684",
// "bonus_dnw": "0",
// "point_refr": "0",
// "bonus_offset": "0",
// "fee": "-0.20132775",
// "point_dnw": "0",
// },
// "unrealised_pnl": "13.315100000006",
// "total": "12.51345151332",
// "available": "0",
// "in_dual_mode": false,
// "currency": "USDT",
// "position_margin": "12.51345151332",
// "user": "6333333",
// }
//
// Delivery Future
//
// {
// "order_margin": "0",
// "point": "0",
// "history": {
// "dnw": "1",
// "pnl": "0",
// "refr": "0",
// "point_fee": "0",
// "point_dnw": "0",
// "settle": "0",
// "settle_fee": "0",
// "point_refr": "0",
// "fee": "0",
// },
// "unrealised_pnl": "0",
// "total": "1",
// "available": "1",
// "currency": "USDT",
// "position_margin": "0",
// "user": "6333333",
// }
//
// option
//
// {
// "order_margin": "0",
// "bid_order_margin": "0",
// "init_margin": "0",
// "history": {
// "dnw": "32",
// "set": "0",
// "point_fee": "0",
// "point_dnw": "0",
// "prem": "0",
// "point_refr": "0",
// "insur": "0",
// "fee": "0",
// "refr": "0"
// },
// "total": "32",
// "available": "32",
// "liq_triggered": false,
// "maint_margin": "0",
// "ask_order_margin": "0",
// "point": "0",
// "position_notional_limit": "2000000",
// "unrealised_pnl": "0",
// "equity": "32",
// "user": 5691076,
// "currency": "USDT",
// "short_enabled": false,
// "orders_limit": 10
// }
//
// unified
//
// {
// "user_id": 10001,
// "locked": false,
// "balances": {
// "ETH": {
// "available": "0",
// "freeze": "0",
// "borrowed": "0.075393666654",
// "negative_liab": "0",
// "futures_pos_liab": "0",
// "equity": "1016.1",
// "total_freeze": "0",
// "total_liab": "0"
// },
// "POINT": {
// "available": "9999999999.017023138734",
// "freeze": "0",
// "borrowed": "0",
// "negative_liab": "0",
// "futures_pos_liab": "0",
// "equity": "12016.1",
// "total_freeze": "0",
// "total_liab": "0"
// },
// "USDT": {
// "available": "0.00000062023",
// "freeze": "0",
// "borrowed": "0",
// "negative_liab": "0",
// "futures_pos_liab": "0",
// "equity": "16.1",
// "total_freeze": "0",
// "total_liab": "0"
// }
// },
// "total": "230.94621713",
// "borrowed": "161.66395521",
// "total_initial_margin": "1025.0524665088",
// "total_margin_balance": "3382495.944473949183",
// "total_maintenance_margin": "205.01049330176",
// "total_initial_margin_rate": "3299.827135672679",
// "total_maintenance_margin_rate": "16499.135678363399",
// "total_available_margin": "3381470.892007440383",
// "unified_account_total": "3381470.892007440383",
// "unified_account_total_liab": "0",
// "unified_account_total_equity": "100016.1",
// "leverage": "2"
// }
//
var result interface{} = map[string]interface{} {
"info": response,
}
var isolated interface{} = IsEqual(marginMode, "margin")
var data interface{} = response
if IsTrue(InOp(data, "balances")) {
var flatBalances interface{} = []interface{}{}
var balances interface{} = this.SafeValue(data, "balances", []interface{}{})
// inject currency and create an artificial balance object
// so it can follow the existent flow
var keys interface{} = ObjectKeys(balances)
for i := 0; IsLessThan(i, GetArrayLength(keys)); i++ {
var currencyId interface{} = GetValue(keys, i)
var content interface{} = GetValue(balances, currencyId)
AddElementToObject(content, "currency", currencyId)
AppendToArray(&flatBalances,content)
}
data = flatBalances
}
for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
var entry interface{} = GetValue(data, i)
if IsTrue(isolated) {
var marketId interface{} = this.SafeString(entry, "currency_pair")
var symbolInner interface{} = this.SafeSymbol(marketId, nil, "_", "margin")
var base interface{} = this.SafeValue(entry, "base", map[string]interface{} {})
var quote interface{} = this.SafeValue(entry, "quote", map[string]interface{} {})
var baseCode interface{} = this.SafeCurrencyCode(this.SafeString(base, "currency"))
var quoteCode interface{} = this.SafeCurrencyCode(this.SafeString(quote, "currency"))
var subResult interface{} = map[string]interface{} {}
AddElementToObject(subResult, baseCode, this.ParseBalanceHelper(base))
AddElementToObject(subResult, quoteCode, this.ParseBalanceHelper(quote))
AddElementToObject(result, symbolInner, this.SafeBalance(subResult))
} else {
var code interface{} = this.SafeCurrencyCode(this.SafeString(entry, "currency"))
AddElementToObject(result, code, this.ParseBalanceHelper(entry))
}
}
var returnResult interface{} = Ternary(IsTrue(isolated), result, this.SafeBalance(result))
ch <- returnResult
return nil
}()
return ch
}
/**
* @method
* @name gateio#fetchOHLCV
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
* @see https://www.gate.io/docs/developers/apiv4/en/#market-candlesticks // spot
* @see https://www.gate.io/docs/developers/apiv4/en/#get-futures-candlesticks // swap
* @see https://www.gate.io/docs/developers/apiv4/en/#market-candlesticks // future
* @see https://www.gate.io/docs/developers/apiv4/en/#get-options-candlesticks // option
* @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, limit is conflicted with since and params["until"], If either since and params["until"] is specified, request will be rejected
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.price] "mark" or "index" for mark price and index price candles
* @param {int} [params.until] timestamp in ms of the latest candle to fetch
* @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 {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume (units in quote currency)
*/
func (this *gate) 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
retRes32038 := (<-this.LoadMarkets())
PanicOnError(retRes32038)
var market interface{} = this.Market(symbol)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchOHLCV", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes320819 := (<-this.FetchPaginatedCallDeterministic("fetchOHLCV", symbol, since, limit, timeframe, params, 1000))
PanicOnError(retRes320819)
ch <- retRes320819
return nil
}
if IsTrue(GetValue(market, "option")) {
retRes321119 := (<-this.FetchOptionOHLCV(symbol, timeframe, since, limit, params))
PanicOnError(retRes321119)
ch <- retRes321119
return nil
}
var price interface{} = this.SafeString(params, "price")
var request interface{} = map[string]interface{} {}
requestparamsVariable := this.PrepareRequest(market, nil, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
AddElementToObject(request, "interval", this.SafeString(this.Timeframes, timeframe, timeframe))
var maxLimit interface{} = Ternary(IsTrue(GetValue(market, "contract")), 1999, 1000)
limit = Ternary(IsTrue((IsEqual(limit, nil))), maxLimit, mathMin(limit, maxLimit))
var until interface{} = this.SafeInteger(params, "until")
if IsTrue(!IsEqual(until, nil)) {
until = this.ParseToInt(Divide(until, 1000))
params = this.Omit(params, "until")
}
if IsTrue(!IsEqual(since, nil)) {
var duration interface{} = this.ParseTimeframe(timeframe)
AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
var distance interface{} = Multiply((Subtract(limit, 1)), duration)
var toTimestamp interface{} = this.Sum(GetValue(request, "from"), distance)
var currentTimestamp interface{} = this.Seconds()
var to interface{} = mathMin(toTimestamp, currentTimestamp)
if IsTrue(!IsEqual(until, nil)) {
AddElementToObject(request, "to", mathMin(to, until))
} else {
AddElementToObject(request, "to", to)
}
} else {
if IsTrue(!IsEqual(until, nil)) {
AddElementToObject(request, "to", until)
}
AddElementToObject(request, "limit", limit)
}
var response interface{} = nil
if IsTrue(GetValue(market, "contract")) {
var isMark interface{} = (IsEqual(price, "mark"))
var isIndex interface{} = (IsEqual(price, "index"))
if IsTrue(IsTrue(isMark) || IsTrue(isIndex)) {
AddElementToObject(request, "contract", Add(Add(price, "_"), GetValue(market, "id")))
params = this.Omit(params, "price")
}
if IsTrue(GetValue(market, "future")) {
response = (<-this.PublicDeliveryGetSettleCandlesticks(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "swap")) {
response = (<-this.PublicFuturesGetSettleCandlesticks(this.Extend(request, params)))
PanicOnError(response)
}
} else {
response = (<-this.PublicSpotGetCandlesticks(this.Extend(request, params)))
PanicOnError(response)
}
ch <- this.ParseOHLCVs(response, market, timeframe, since, limit)
return nil
}()
return ch
}
func (this *gate) FetchOptionOHLCV(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
// separated option logic because the from, to and limit parameters weren't functioning
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
retRes32638 := (<-this.LoadMarkets())
PanicOnError(retRes32638)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {}
requestparamsVariable := this.PrepareRequest(market, nil, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
AddElementToObject(request, "interval", this.SafeString(this.Timeframes, timeframe, timeframe))
response:= (<-this.PublicOptionsGetCandlesticks(this.Extend(request, params)))
PanicOnError(response)
ch <- this.ParseOHLCVs(response, market, timeframe, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchFundingRateHistory
* @description fetches historical funding rate prices
* @see https://www.gate.io/docs/developers/apiv4/en/#funding-rate-history
* @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]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure} to fetch
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] timestamp in ms of the latest funding rate to fetch
* @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 rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure}
*/
func (this *gate) 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")))
}
retRes32898 := (<-this.LoadMarkets())
PanicOnError(retRes32898)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchFundingRateHistory", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes329319 := (<-this.FetchPaginatedCallDeterministic("fetchFundingRateHistory", symbol, since, limit, "8h", params))
PanicOnError(retRes329319)
ch <- retRes329319
return nil
}
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "swap")) {
panic(BadSymbol(Add(this.Id, " fetchFundingRateHistory() supports swap contracts only")))
}
var request interface{} = map[string]interface{} {}
requestparamsVariable := this.PrepareRequest(market, nil, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
}
var until interface{} = this.SafeInteger(params, "until")
if IsTrue(!IsEqual(until, nil)) {
params = this.Omit(params, "until")
AddElementToObject(request, "to", this.ParseToInt(Divide(until, 1000)))
}
response:= (<-this.PublicFuturesGetSettleFundingRate(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "r": "0.00063521",
// "t": "1621267200000",
// }
//
var rates interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var entry interface{} = GetValue(response, i)
var timestamp interface{} = this.SafeTimestamp(entry, "t")
AppendToArray(&rates,map[string]interface{} {
"info": entry,
"symbol": symbol,
"fundingRate": this.SafeNumber(entry, "r"),
"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
}
func (this *gate) ParseOHLCV(ohlcv interface{}, optionalArgs ...interface{}) interface{} {
//
// Spot market candles
//
// [
// "1660957920", // timestamp
// "6227.070147198573", // quote volume
// "0.0000133485", // close
// "0.0000133615", // high
// "0.0000133347", // low
// "0.0000133468", // open
// "466641934.99" // base volume
// ]
//
//
// Swap, Future, Option, Mark and Index price candles
//
// {
// "t":1632873600, // Unix timestamp in seconds
// "o": "41025", // Open price
// "h": "41882.17", // Highest price
// "c": "41776.92", // Close price
// "l": "40783.94" // Lowest price
// }
//
// Swap, Future, Option, Mark and Index price candles
market := GetArg(optionalArgs, 0, nil)
_ = market
if IsTrue(IsArray(ohlcv)) {
return []interface{}{this.SafeTimestamp(ohlcv, 0), this.SafeNumber(ohlcv, 5), this.SafeNumber(ohlcv, 3), this.SafeNumber(ohlcv, 4), this.SafeNumber(ohlcv, 2), this.SafeNumber(ohlcv, 6)}
} else {
return []interface{}{this.SafeTimestamp(ohlcv, "t"), this.SafeNumber(ohlcv, "o"), this.SafeNumber(ohlcv, "h"), this.SafeNumber(ohlcv, "l"), this.SafeNumber(ohlcv, "c"), this.SafeNumber(ohlcv, "v")}
}
}
/**
* @method
* @name gate#fetchTrades
* @description get the list of most recent trades for a particular symbol
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-market-trades
* @see https://www.gate.io/docs/developers/apiv4/en/#futures-trading-history
* @see https://www.gate.io/docs/developers/apiv4/en/#futures-trading-history-2
* @see https://www.gate.io/docs/developers/apiv4/en/#options-trade-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] timestamp in ms of the latest trade to fetch
* @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 {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
*/
func (this *gate) 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
retRes33998 := (<-this.LoadMarkets())
PanicOnError(retRes33998)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchTrades", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes340319 := (<-this.FetchPaginatedCallDynamic("fetchTrades", symbol, since, limit, params))
PanicOnError(retRes340319)
ch <- retRes340319
return nil
}
var market interface{} = this.Market(symbol)
//
// spot
//
// const request: Dict = {
// 'currency_pair': market['id'],
// 'limit': limit, // maximum number of records to be returned in a single list
// 'last_id': 'id', // specify list staring point using the id of last record in previous list-query results
// 'reverse': false, // true to retrieve records where id is smaller than the specified last_id, false to retrieve records where id is larger than the specified last_id
// };
//
// swap, future
//
// const request: Dict = {
// 'settle': market['settleId'],
// 'contract': market['id'],
// 'limit': limit, // maximum number of records to be returned in a single list
// 'last_id': 'id', // specify list staring point using the id of last record in previous list-query results
// 'from': since / 1000), // starting time in seconds, if not specified, to and limit will be used to limit response items
// 'to': this.seconds (), // end time in seconds, default to current time
// };
//
requestqueryVariable := this.PrepareRequest(market, nil, params);
request := GetValue(requestqueryVariable,0);
query := GetValue(requestqueryVariable,1)
var until interface{} = this.SafeInteger2(params, "to", "until")
if IsTrue(!IsEqual(until, nil)) {
params = this.Omit(params, []interface{}{"until"})
AddElementToObject(request, "to", this.ParseToInt(Divide(until, 1000)))
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", mathMin(limit, 1000)) // default 100, max 1000
}
if IsTrue(IsTrue(!IsEqual(since, nil)) && IsTrue((GetValue(market, "contract")))) {
AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
}
var response interface{} = nil
if IsTrue(IsTrue(IsEqual(GetValue(market, "type"), "spot")) || IsTrue(IsEqual(GetValue(market, "type"), "margin"))) {
response = (<-this.PublicSpotGetTrades(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "swap")) {
response = (<-this.PublicFuturesGetSettleTrades(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "future")) {
response = (<-this.PublicDeliveryGetSettleTrades(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(IsEqual(GetValue(market, "type"), "option")) {
response = (<-this.PublicOptionsGetTrades(this.Extend(request, query)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchTrades() not support this market type.")))
}
//
// spot
//
// [
// {
// "id": "1852958144",
// "create_time": "1634673259",
// "create_time_ms": "1634673259378.105000",
// "currency_pair": "ADA_USDT",
// "side": "sell",
// "amount": "307.078",
// "price": "2.104",
// }
// ]
//
// perpetual swap
//
// [
// {
// "size": "2",
// "id": "2522911",
// "create_time_ms": "1634673380.182",
// "create_time": "1634673380.182",
// "contract": "ADA_USDT",
// "price": "2.10486",
// }
// ]
//
// option
//
// [
// {
// "size": -5,
// "id": 25,
// "create_time": 1682378573,
// "contract": "ETH_USDT-20230526-2000-P",
// "price": "209.1"
// }
// ]
//
ch <- this.ParseTrades(response, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchOrderTrades
* @description fetch all the trades made from a single order
* @see https://www.gate.io/docs/developers/apiv4/en/#list-personal-trading-history
* @see https://www.gate.io/docs/developers/apiv4/en/#list-personal-trading-history-2
* @see https://www.gate.io/docs/developers/apiv4/en/#list-personal-trading-history-3
* @see https://www.gate.io/docs/developers/apiv4/en/#list-personal-trading-history-4
* @param {string} id order id
* @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 to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
*/
func (this *gate) FetchOrderTrades(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
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, " fetchOrderTrades() requires a symbol argument")))
}
retRes35138 := (<-this.LoadMarkets())
PanicOnError(retRes35138)
//
// [
// {
// "id":"3711449544",
// "create_time":"1655486040",
// "create_time_ms":"1655486040177.599900",
// "currency_pair":"SHIB_USDT",
// "side":"buy",
// "role":"taker",
// "amount":"1360039",
// "price":"0.0000081084",
// "order_id":"169717399644",
// "fee":"2720.078",
// "fee_currency":"SHIB",
// "point_fee":"0",
// "gt_fee":"0"
// }
// ]
//
response:= (<-this.FetchMyTrades(symbol, since, limit, map[string]interface{} {
"order_id": id,
}))
PanicOnError(response)
ch <- response
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchMyTrades
* @description Fetch personal trading history
* @see https://www.gate.io/docs/developers/apiv4/en/#list-personal-trading-history
* @see https://www.gate.io/docs/developers/apiv4/en/#list-personal-trading-history-2
* @see https://www.gate.io/docs/developers/apiv4/en/#list-personal-trading-history-3
* @see https://www.gate.io/docs/developers/apiv4/en/#list-personal-trading-history-4
* @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 {string} [params.marginMode] 'cross' or 'isolated' - marginMode for margin trading if not provided this.options['defaultMarginMode'] is used
* @param {string} [params.type] 'spot', 'swap', or 'future', if not provided this.options['defaultMarginMode'] is used
* @param {int} [params.until] The latest timestamp, in ms, that fetched trades were made
* @param {int} [params.page] *spot only* Page number
* @param {string} [params.order_id] *spot only* Filter trades with specified order ID. symbol is also required if this field is present
* @param {string} [params.order] *contract only* Futures order ID, return related data only if specified
* @param {int} [params.offset] *contract only* list offset, starting from 0
* @param {string} [params.last_id] *contract only* specify list staring point using the id of last record in previous list-query results
* @param {int} [params.count_total] *contract only* whether to return total number matched, default to 0(no return)
* @param {bool} [params.unifiedAccount] set to true for fetching trades in a unified account
* @param {bool} [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 *gate) 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
retRes35638 := (<-this.LoadMarkets())
PanicOnError(retRes35638)
retRes35648 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes35648)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchMyTrades", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes356819 := (<-this.FetchPaginatedCallDynamic("fetchMyTrades", symbol, since, limit, params))
PanicOnError(retRes356819)
ch <- retRes356819
return nil
}
var typeVar interface{} = nil
var marginMode interface{} = nil
var request interface{} = map[string]interface{} {}
var market interface{} = Ternary(IsTrue((!IsEqual(symbol, nil))), this.Market(symbol), nil)
var until interface{} = this.SafeInteger(params, "until")
params = this.Omit(params, []interface{}{"until"})
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchMyTrades", market, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
var contract interface{} = IsTrue(IsTrue((IsEqual(typeVar, "swap"))) || IsTrue((IsEqual(typeVar, "future")))) || IsTrue((IsEqual(typeVar, "option")))
if IsTrue(contract) {
requestparamsVariable := this.PrepareRequest(market, typeVar, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(IsEqual(typeVar, "option")) {
params = this.Omit(params, "order_id")
}
} else {
if IsTrue(!IsEqual(market, nil)) {
AddElementToObject(request, "currency_pair", GetValue(market, "id")) // Should always be set for non-trigger
}
marginModeparamsVariable := this.GetMarginMode(false, params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
AddElementToObject(request, "account", marginMode)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit) // default 100, max 1000
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
}
if IsTrue(!IsEqual(until, nil)) {
AddElementToObject(request, "to", this.ParseToInt(Divide(until, 1000)))
}
var response interface{} = nil
if IsTrue(IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "margin"))) {
response = (<-this.PrivateSpotGetMyTrades(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "swap")) {
response = (<-this.PrivateFuturesGetSettleMyTradesTimerange(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "future")) {
response = (<-this.PrivateDeliveryGetSettleMyTrades(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "option")) {
response = (<-this.PrivateOptionsGetMyTrades(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchMyTrades() not support this market type.")))
}
//
// spot
//
// [
// {
// "id": "2876130500",
// "create_time": "1645464610",
// "create_time_ms": "1645464610777.399200",
// "currency_pair": "DOGE_USDT",
// "side": "sell",
// "role": "taker",
// "amount": "10.97",
// "price": "0.137384",
// "order_id": "125924049993",
// "fee": "0.00301420496",
// "fee_currency": "USDT",
// "point_fee": "0",
// "gt_fee": "0"
// }
// ]
//
// perpetual swap
//
// [
// {
// "size": -5,
// "order_id": "130264979823",
// "id": 26884791,
// "role": "taker",
// "create_time": 1645465199.5472,
// "contract": "DOGE_USDT",
// "price": "0.136888"
// }
// ]
//
// future
//
// [
// {
// "id": 121234231,
// "create_time": 1514764800.123,
// "contract": "BTC_USDT",
// "order_id": "21893289839",
// "size": 100,
// "price": "100.123",
// "role": "taker"
// }
// ]
//
// option
//
// [
// {
// "underlying_price": "26817.84",
// "size": -1,
// "contract": "BTC_USDT-20230602-26500-C",
// "id": 16,
// "role": "taker",
// "create_time": 1685594770,
// "order_id": 2611026125,
// "price": "333"
// }
// ]
//
ch <- this.ParseTrades(response, market, since, limit)
return nil
}()
return ch
}
func (this *gate) ParseTrade(trade interface{}, optionalArgs ...interface{}) interface{} {
//
// public
//
// spot:
// {
// "id": "1334253759",
// "create_time": "1626342738",
// "create_time_ms": "1626342738331.497000",
// "currency_pair": "BTC_USDT",
// "side": "sell",
// "amount": "0.0022",
// "price": "32452.16"
// }
//
// swap:
//
// {
// "id": "442288327",
// "contract": "BTC_USDT",
// "create_time": "1739814676.707",
// "create_time_ms": "1739814676.707",
// "size": "-105",
// "price": "95594.8"
// }
//
//
// public ws
//
// {
// "id": 221994511,
// "time": 1580311438.618647,
// "price": "9309",
// "amount": "0.0019",
// "type": "sell"
// }
//
// spot rest
//
// {
// "id": "2876130500",
// "create_time": "1645464610",
// "create_time_ms": "1645464610777.399200",
// "currency_pair": "DOGE_USDT",
// "side": "sell",
// "role": "taker",
// "amount": "10.97",
// "price": "0.137384",
// "order_id": "125924049993",
// "fee": "0.00301420496",
// "fee_currency": "USDT",
// "point_fee": "1.1",
// "gt_fee":"2.2"
// }
//
// perpetual swap rest
//
// {
// "size": -5,
// "order_id": "130264979823",
// "id": 26884791,
// "role": "taker",
// "create_time": 1645465199.5472,
// "contract": "DOGE_USDT",
// "price": "0.136888"
// }
//
// future rest
//
// {
// "id": 121234231,
// "create_time": 1514764800.123,
// "contract": "BTC_USDT",
// "order_id": "21893289839",
// "size": 100,
// "price": "100.123",
// "role": "taker"
// }
//
// fetchTrades: option
//
// {
// "size": -5,
// "id": 25,
// "create_time": 1682378573,
// "contract": "ETH_USDT-20230526-2000-P",
// "price": "209.1"
// }
//
// fetchMyTrades: option
//
// {
// "underlying_price": "26817.84",
// "size": -1,
// "contract": "BTC_USDT-20230602-26500-C",
// "id": 16,
// "role": "taker",
// "create_time": 1685594770,
// "order_id": 2611026125,
// "price": "333"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var id interface{} = this.SafeString2(trade, "id", "trade_id")
var timestamp interface{} = nil
var msString interface{} = this.SafeString(trade, "create_time_ms")
if IsTrue(!IsEqual(msString, nil)) {
msString = Precise.StringMul(msString, "1000")
msString = Slice(msString, 0, 13)
timestamp = this.ParseToInt(msString)
} else {
timestamp = this.SafeTimestamp2(trade, "time", "create_time")
}
var marketId interface{} = this.SafeString2(trade, "currency_pair", "contract")
var marketType interface{} = Ternary(IsTrue((InOp(trade, "contract"))), "contract", "spot")
market = this.SafeMarket(marketId, market, "_", marketType)
var amountString interface{} = this.SafeString2(trade, "amount", "size")
var priceString interface{} = this.SafeString(trade, "price")
var contractSide interface{} = Ternary(IsTrue(Precise.StringLt(amountString, "0")), "sell", "buy")
amountString = Precise.StringAbs(amountString)
var side interface{} = this.SafeString2(trade, "side", "type", contractSide)
var orderId interface{} = this.SafeString(trade, "order_id")
var feeAmount interface{} = this.SafeString(trade, "fee")
var gtFee interface{} = this.OmitZero(this.SafeString(trade, "gt_fee"))
var pointFee interface{} = this.OmitZero(this.SafeString(trade, "point_fee"))
var fees interface{} = []interface{}{}
if IsTrue(!IsEqual(feeAmount, nil)) {
var feeCurrencyId interface{} = this.SafeString(trade, "fee_currency")
var feeCurrencyCode interface{} = this.SafeCurrencyCode(feeCurrencyId)
if IsTrue(IsEqual(feeCurrencyCode, nil)) {
feeCurrencyCode = this.SafeString(market, "settle")
}
AppendToArray(&fees,map[string]interface{} {
"cost": feeAmount,
"currency": feeCurrencyCode,
})
}
if IsTrue(!IsEqual(gtFee, nil)) {
AppendToArray(&fees,map[string]interface{} {
"cost": gtFee,
"currency": "GT",
})
}
if IsTrue(!IsEqual(pointFee, nil)) {
AppendToArray(&fees,map[string]interface{} {
"cost": pointFee,
"currency": "GatePoint",
})
}
var takerOrMaker interface{} = this.SafeString(trade, "role")
return this.SafeTrade(map[string]interface{} {
"info": trade,
"id": id,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"symbol": GetValue(market, "symbol"),
"order": orderId,
"type": nil,
"side": side,
"takerOrMaker": takerOrMaker,
"price": priceString,
"amount": amountString,
"cost": nil,
"fee": nil,
"fees": fees,
}, market)
}
/**
* @method
* @name gate#fetchDeposits
* @description fetch all deposits made to an account
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-deposit-records
* @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 ms
* @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 [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
func (this *gate) 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
retRes38598 := (<-this.LoadMarkets())
PanicOnError(retRes38598)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchDeposits", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes386319 := (<-this.FetchPaginatedCallDynamic("fetchDeposits", code, since, limit, params))
PanicOnError(retRes386319)
ch <- retRes386319
return nil
}
var request interface{} = map[string]interface{} {}
var currency interface{} = nil
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "currency", GetValue(currency, "id")) // todo: currencies have network-junctions
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(!IsEqual(since, nil)) {
var start interface{} = this.ParseToInt(Divide(since, 1000))
AddElementToObject(request, "from", start)
AddElementToObject(request, "to", this.Sum(start, Multiply(Multiply(Multiply(30, 24), 60), 60)))
}
requestparamsVariable := this.HandleUntilOption("to", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
response:= (<-this.PrivateWalletGetDeposits(this.Extend(request, params)))
PanicOnError(response)
ch <- this.ParseTransactions(response, currency)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchWithdrawals
* @description fetch all withdrawals made from an account
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-withdrawal-records
* @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 ms
* @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 [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
func (this *gate) 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
retRes38988 := (<-this.LoadMarkets())
PanicOnError(retRes38988)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchWithdrawals", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes390219 := (<-this.FetchPaginatedCallDynamic("fetchWithdrawals", code, since, limit, params))
PanicOnError(retRes390219)
ch <- retRes390219
return nil
}
var request interface{} = map[string]interface{} {}
var currency interface{} = nil
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "currency", GetValue(currency, "id")) // todo: currencies have network-junctions
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(!IsEqual(since, nil)) {
var start interface{} = this.ParseToInt(Divide(since, 1000))
AddElementToObject(request, "from", start)
AddElementToObject(request, "to", this.Sum(start, Multiply(Multiply(Multiply(30, 24), 60), 60)))
}
requestparamsVariable := this.HandleUntilOption("to", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
response:= (<-this.PrivateWalletGetWithdrawals(this.Extend(request, params)))
PanicOnError(response)
ch <- this.ParseTransactions(response, currency)
return nil
}()
return ch
}
/**
* @method
* @name gate#withdraw
* @description make a withdrawal
* @see https://www.gate.io/docs/developers/apiv4/en/#withdraw
* @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
* @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
func (this *gate) 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
tagparamsVariable := this.HandleWithdrawTagAndParams(tag, params);
tag = GetValue(tagparamsVariable,0);
params = GetValue(tagparamsVariable,1)
this.CheckAddress(address)
retRes39388 := (<-this.LoadMarkets())
PanicOnError(retRes39388)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"currency": GetValue(currency, "id"),
"address": address,
"amount": this.CurrencyToPrecision(code, amount),
}
if IsTrue(!IsEqual(tag, nil)) {
AddElementToObject(request, "memo", tag)
}
var networkCode interface{} = nil
networkCodeparamsVariable := this.HandleNetworkCodeAndParams(params);
networkCode = GetValue(networkCodeparamsVariable,0);
params = GetValue(networkCodeparamsVariable,1)
if IsTrue(!IsEqual(networkCode, nil)) {
AddElementToObject(request, "chain", this.NetworkCodeToId(networkCode))
}
response:= (<-this.PrivateWithdrawalsPostWithdrawals(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "id": "w13389675",
// "currency": "USDT",
// "amount": "50",
// "address": "TUu2rLFrmzUodiWfYki7QCNtv1akL682p1",
// "memo": null
// }
//
ch <- this.ParseTransaction(response, currency)
return nil
}()
return ch
}
func (this *gate) ParseTransactionStatus(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"PEND": "pending",
"REQUEST": "pending",
"DMOVE": "pending",
"MANUAL": "pending",
"VERIFY": "pending",
"PROCES": "pending",
"EXTPEND": "pending",
"SPLITPEND": "pending",
"CANCEL": "canceled",
"FAIL": "failed",
"INVALID": "failed",
"DONE": "ok",
"BCODE": "ok",
}
return this.SafeString(statuses, status, status)
}
func (this *gate) ParseTransactionType(typeVar interface{}) interface{} {
var types interface{} = map[string]interface{} {
"d": "deposit",
"w": "withdrawal",
}
return this.SafeString(types, typeVar, typeVar)
}
func (this *gate) ParseTransaction(transaction interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchDeposits
//
// {
// "id": "d33361395",
// "currency": "USDT_TRX",
// "address": "TErdnxenuLtXfnMafLbfappYdHtnXQ5U4z",
// "amount": "100",
// "txid": "ae9374de34e558562fe18cbb1bf9ab4d9eb8aa7669d65541c9fa2a532c1474a0",
// "timestamp": "1626345819",
// "status": "DONE",
// "memo": ""
// }
//
// withdraw
//
// {
// "id":"w64413318",
// "currency":"usdt",
// "amount":"10150",
// "address":"0x0ab891497116f7f5532a4c2f4f7b1784488628e1",
// "memo":null,
// "status":"REQUEST",
// "chain":"eth",
// "withdraw_order_id":"",
// "fee_amount":"4.15000000"
// }
//
// fetchWithdrawals
//
// {
// "id": "210496",
// "timestamp": "1542000000",
// "withdraw_order_id": "order_123456",
// "currency": "USDT",
// "address": "1HkxtBAMrA3tP5ENnYY2CZortjZvFDH5Cs",
// "txid": "128988928203223323290",
// "block_number": "41575382",
// "amount": "222.61",
// "fee": "0.01",
// "memo": "",
// "status": "DONE",
// "chain": "TRX"
// }
//
// {
// "id": "w13389675",
// "currency": "USDT",
// "amount": "50",
// "address": "TUu2rLFrmzUodiWfYki7QCNtv1akL682p1",
// "memo": null
// }
//
// {
// "currency":"usdt",
// "address":"0x01c0A9b7b4CdE774AF0f3E47CB4f1c2CCdBa0806",
// "amount":"1880",
// "chain":"eth"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var id interface{} = this.SafeString(transaction, "id")
var typeVar interface{} = nil
var amountString interface{} = this.SafeString(transaction, "amount")
if IsTrue(!IsEqual(id, nil)) {
if IsTrue(IsEqual(GetValue(id, 0), "b")) {
// GateCode handling
typeVar = Ternary(IsTrue(Precise.StringGt(amountString, "0")), "deposit", "withdrawal")
amountString = Precise.StringAbs(amountString)
} else {
typeVar = this.ParseTransactionType(GetValue(id, 0))
}
}
var feeCostString interface{} = this.SafeString2(transaction, "fee", "fee_amount")
if IsTrue(IsEqual(typeVar, "withdrawal")) {
amountString = Precise.StringSub(amountString, feeCostString)
}
var networkId interface{} = this.SafeStringUpper(transaction, "chain")
var currencyId interface{} = this.SafeString(transaction, "currency")
var code interface{} = this.SafeCurrencyCode(currencyId)
var txid interface{} = this.SafeString(transaction, "txid")
var rawStatus interface{} = this.SafeString(transaction, "status")
var status interface{} = this.ParseTransactionStatus(rawStatus)
var address interface{} = this.SafeString(transaction, "address")
var tag interface{} = this.SafeString(transaction, "memo")
var timestamp interface{} = this.SafeTimestamp(transaction, "timestamp")
return map[string]interface{} {
"info": transaction,
"id": id,
"txid": txid,
"currency": code,
"amount": this.ParseNumber(amountString),
"network": this.NetworkIdToCode(networkId),
"address": address,
"addressTo": nil,
"addressFrom": nil,
"tag": tag,
"tagTo": nil,
"tagFrom": nil,
"status": status,
"type": typeVar,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"updated": nil,
"internal": nil,
"comment": nil,
"fee": map[string]interface{} {
"currency": code,
"cost": this.ParseNumber(feeCostString),
},
}
}
/**
* @method
* @name gate#createOrder
* @description Create an order on the exchange
* @see https://www.gate.io/docs/developers/apiv4/en/#create-an-order
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-price-triggered-order
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-futures-order
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-price-triggered-order-2
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-futures-order-2
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-price-triggered-order-3
* @see https://www.gate.io/docs/developers/apiv4/en/#create-an-options-order
* @param {string} symbol Unified CCXT market symbol
* @param {string} type 'limit' or 'market' *"market" is contract only*
* @param {string} side 'buy' or 'sell'
* @param {float} amount the amount of currency to trade
* @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 at which a trigger order is triggered at
* @param {string} [params.timeInForce] "GTC", "IOC", or "PO"
* @param {float} [params.stopLossPrice] The price at which a stop loss order is triggered at
* @param {float} [params.takeProfitPrice] The price at which a take profit order is triggered at
* @param {string} [params.marginMode] 'cross' or 'isolated' - marginMode for margin trading if not provided this.options['defaultMarginMode'] is used
* @param {int} [params.iceberg] Amount to display for the iceberg order, Null or 0 for normal orders, Set to -1 to hide the order completely
* @param {string} [params.text] User defined information
* @param {string} [params.account] *spot and margin only* "spot", "margin" or "cross_margin"
* @param {bool} [params.auto_borrow] *margin only* Used in margin or cross margin trading to allow automatic loan of insufficient amount if balance is not enough
* @param {string} [params.settle] *contract only* Unified Currency Code for settle currency
* @param {bool} [params.reduceOnly] *contract only* Indicates if this order is to reduce the size of a position
* @param {bool} [params.close] *contract only* Set as true to close the position, with size set to 0
* @param {bool} [params.auto_size] *contract only* Set side to close dual-mode position, close_long closes the long side, while close_short the short one, size also needs to be set to 0
* @param {int} [params.price_type] *contract only* 0 latest deal price, 1 mark price, 2 index price
* @param {float} [params.cost] *spot market buy only* the quote quantity that can be used as an alternative for the amount
* @param {bool} [params.unifiedAccount] set to true for creating an order in the unified account
* @returns {object|undefined} [An order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes41428 := (<-this.LoadMarkets())
PanicOnError(retRes41428)
retRes41438 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes41438)
var market interface{} = this.Market(symbol)
var trigger interface{} = this.SafeValue(params, "trigger")
var triggerPrice interface{} = this.SafeValue2(params, "triggerPrice", "stopPrice")
var stopLossPrice interface{} = this.SafeValue(params, "stopLossPrice", triggerPrice)
var takeProfitPrice interface{} = this.SafeValue(params, "takeProfitPrice")
var isStopLossOrder interface{} = !IsEqual(stopLossPrice, nil)
var isTakeProfitOrder interface{} = !IsEqual(takeProfitPrice, nil)
var isTpsl interface{} = IsTrue(isStopLossOrder) || IsTrue(isTakeProfitOrder)
var nonTriggerOrder interface{} = !IsTrue(isTpsl) && IsTrue((IsEqual(trigger, nil)))
var orderRequest interface{} = this.CreateOrderRequest(symbol, typeVar, side, amount, price, params)
var response interface{} = nil
if IsTrue(IsTrue(GetValue(market, "spot")) || IsTrue(GetValue(market, "margin"))) {
if IsTrue(nonTriggerOrder) {
response = (<-this.PrivateSpotPostOrders(orderRequest))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotPostPriceOrders(orderRequest))
PanicOnError(response)
}
} else if IsTrue(GetValue(market, "swap")) {
if IsTrue(nonTriggerOrder) {
response = (<-this.PrivateFuturesPostSettleOrders(orderRequest))
PanicOnError(response)
} else {
response = (<-this.PrivateFuturesPostSettlePriceOrders(orderRequest))
PanicOnError(response)
}
} else if IsTrue(GetValue(market, "future")) {
if IsTrue(nonTriggerOrder) {
response = (<-this.PrivateDeliveryPostSettleOrders(orderRequest))
PanicOnError(response)
} else {
response = (<-this.PrivateDeliveryPostSettlePriceOrders(orderRequest))
PanicOnError(response)
}
} else {
response = (<-this.PrivateOptionsPostOrders(orderRequest))
PanicOnError(response)
}
// const response = await this[method] (this.deepExtend (request, params));
//
// spot
//
// {
// "id": "95282841887",
// "text": "apiv4",
// "create_time": "1637383156",
// "update_time": "1637383156",
// "create_time_ms": 1637383156017,
// "update_time_ms": 1637383156017,
// "status": "open",
// "currency_pair": "ETH_USDT",
// "type": "limit",
// "account": "spot",
// "side": "buy",
// "amount": "0.01",
// "price": "3500",
// "time_in_force": "gtc",
// "iceberg": "0",
// "left": "0.01",
// "fill_price": "0",
// "filled_total": "0",
// "fee": "0",
// "fee_currency": "ETH",
// "point_fee": "0",
// "gt_fee": "0",
// "gt_discount": false,
// "rebated_fee": "0",
// "rebated_fee_currency": "USDT"
// }
//
// spot conditional
//
// {"id": 5891843}
//
// futures, perpetual swaps and options
//
// {
// "id": 95938572327,
// "contract": "ETH_USDT",
// "mkfr": "0",
// "tkfr": "0.0005",
// "tif": "gtc",
// "is_reduce_only": false,
// "create_time": 1637384600.08,
// "price": "3000",
// "size": 1,
// "refr": "0",
// "left": 1,
// "text": "api",
// "fill_price": "0",
// "user": 2436035,
// "status": "open",
// "is_liq": false,
// "refu": 0,
// "is_close": false,
// "iceberg": 0
// }
//
// futures and perpetual swaps conditionals
//
// {"id": 7615567}
//
ch <- this.ParseOrder(response, market)
return nil
}()
return ch
}
func (this *gate) CreateOrdersRequest(orders interface{}, optionalArgs ...interface{}) interface{} {
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
var ordersRequests interface{} = []interface{}{}
var orderSymbols interface{} = []interface{}{}
var ordersLength interface{} = GetArrayLength(orders)
if IsTrue(IsEqual(ordersLength, 0)) {
panic(BadRequest(Add(this.Id, " createOrders() requires at least one order")))
}
if IsTrue(IsGreaterThan(ordersLength, 10)) {
panic(BadRequest(Add(this.Id, " createOrders() accepts a maximum of 10 orders at a time")))
}
for i := 0; IsLessThan(i, GetArrayLength(orders)); i++ {
var rawOrder interface{} = GetValue(orders, i)
var marketId interface{} = this.SafeString(rawOrder, "symbol")
AppendToArray(&orderSymbols,marketId)
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 extendedParams interface{} = this.Extend(orderParams, params) // the request does not accept extra params since it's a list, so we're extending each order with the common params
var triggerValue interface{} = this.SafeValueN(orderParams, []interface{}{"triggerPrice", "stopPrice", "takeProfitPrice", "stopLossPrice"})
if IsTrue(!IsEqual(triggerValue, nil)) {
panic(NotSupported(Add(this.Id, " createOrders() does not support advanced order properties (stopPrice, takeProfitPrice, stopLossPrice)")))
}
AddElementToObject(extendedParams, "textIsRequired", true) // Gate.io requires a text parameter for each order here
var orderRequest interface{} = this.CreateOrderRequest(marketId, typeVar, side, amount, price, extendedParams)
AppendToArray(&ordersRequests,orderRequest)
}
var symbols interface{} = this.MarketSymbols(orderSymbols, nil, false, true, true)
var market interface{} = this.Market(GetValue(symbols, 0))
if IsTrue(IsTrue(GetValue(market, "future")) || IsTrue(GetValue(market, "option"))) {
panic(NotSupported(Add(this.Id, " createOrders() does not support futures or options markets")))
}
return ordersRequests
}
/**
* @method
* @name gate#createOrders
* @description create a list of trade orders
* @see https://www.gate.io/docs/developers/apiv4/en/#get-a-single-order-2
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-batch-of-orders
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-batch-of-futures-orders
* @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 exchange API endpoint
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes42918 := (<-this.LoadMarkets())
PanicOnError(retRes42918)
retRes42928 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes42928)
var ordersRequests interface{} = this.CreateOrdersRequest(orders, params)
var firstOrder interface{} = GetValue(orders, 0)
var market interface{} = this.Market(GetValue(firstOrder, "symbol"))
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
response = (<-this.PrivateSpotPostBatchOrders(ordersRequests))
PanicOnError(response)
} else if IsTrue(GetValue(market, "swap")) {
response = (<-this.PrivateFuturesPostSettleBatchOrders(ordersRequests))
PanicOnError(response)
}
ch <- this.ParseOrders(response)
return nil
}()
return ch
}
func (this *gate) 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 market interface{} = this.Market(symbol)
var contract interface{} = GetValue(market, "contract")
var trigger interface{} = this.SafeValue(params, "trigger")
var triggerPrice interface{} = this.SafeValue2(params, "triggerPrice", "stopPrice")
var stopLossPrice interface{} = this.SafeValue(params, "stopLossPrice", triggerPrice)
var takeProfitPrice interface{} = this.SafeValue(params, "takeProfitPrice")
var isStopLossOrder interface{} = !IsEqual(stopLossPrice, nil)
var isTakeProfitOrder interface{} = !IsEqual(takeProfitPrice, nil)
var isTpsl interface{} = IsTrue(isStopLossOrder) || IsTrue(isTakeProfitOrder)
if IsTrue(IsTrue(isStopLossOrder) && IsTrue(isTakeProfitOrder)) {
panic(ExchangeError(Add(this.Id, " createOrder() stopLossPrice and takeProfitPrice cannot both be defined")))
}
var reduceOnly interface{} = this.SafeValue(params, "reduceOnly")
var exchangeSpecificTimeInForce interface{} = this.SafeStringLowerN(params, []interface{}{"timeInForce", "tif", "time_in_force"})
var postOnly interface{} = nil
postOnlyparamsVariable := this.HandlePostOnly(IsEqual(typeVar, "market"), IsEqual(exchangeSpecificTimeInForce, "poc"), params);
postOnly = GetValue(postOnlyparamsVariable,0);
params = GetValue(postOnlyparamsVariable,1)
var timeInForce interface{} = this.HandleTimeInForce(params)
if IsTrue(postOnly) {
timeInForce = "poc"
}
// we only omit the unified params here
// this is because the other params will get extended into the request
params = this.Omit(params, []interface{}{"stopPrice", "triggerPrice", "stopLossPrice", "takeProfitPrice", "reduceOnly", "timeInForce", "postOnly"})
var isLimitOrder interface{} = (IsEqual(typeVar, "limit"))
var isMarketOrder interface{} = (IsEqual(typeVar, "market"))
if IsTrue(IsTrue(isLimitOrder) && IsTrue(IsEqual(price, nil))) {
panic(ArgumentsRequired(Add(Add(Add(this.Id, " createOrder () requires a price argument for "), typeVar), " orders")))
}
if IsTrue(isMarketOrder) {
if IsTrue(IsTrue((IsEqual(timeInForce, "poc"))) || IsTrue((IsEqual(timeInForce, "gtc")))) {
panic(ExchangeError(Add(this.Id, " createOrder () timeInForce for market order can only be \"FOK\" or \"IOC\"")))
} else {
if IsTrue(IsEqual(timeInForce, nil)) {
var defaultTif interface{} = this.SafeString(this.Options, "defaultTimeInForce", "IOC")
var exchangeSpecificTif interface{} = this.SafeString(GetValue(this.Options, "timeInForce"), defaultTif, "ioc")
timeInForce = exchangeSpecificTif
}
}
if IsTrue(contract) {
price = 0
}
}
if IsTrue(contract) {
var isClose interface{} = this.SafeValue(params, "close")
if IsTrue(isClose) {
amount = 0
} else {
var amountToPrecision interface{} = this.AmountToPrecision(symbol, amount)
var signedAmount interface{} = Ternary(IsTrue((IsEqual(side, "sell"))), Precise.StringNeg(amountToPrecision), amountToPrecision)
amount = ParseInt(signedAmount)
}
}
var request interface{} = nil
var nonTriggerOrder interface{} = !IsTrue(isTpsl) && IsTrue((IsEqual(trigger, nil)))
if IsTrue(nonTriggerOrder) {
if IsTrue(contract) {
// contract order
request = map[string]interface{} {
"contract": GetValue(market, "id"),
"size": amount,
}
if !IsTrue(GetValue(market, "option")) {
AddElementToObject(request, "settle", GetValue(market, "settleId")) // filled in prepareRequest above
}
if IsTrue(isMarketOrder) {
AddElementToObject(request, "price", "0") // set to 0 for market orders
} else {
AddElementToObject(request, "price", Ternary(IsTrue((IsEqual(price, 0))), "0", this.PriceToPrecision(symbol, price)))
}
if IsTrue(!IsEqual(reduceOnly, nil)) {
AddElementToObject(request, "reduce_only", reduceOnly)
}
if IsTrue(!IsEqual(timeInForce, nil)) {
AddElementToObject(request, "tif", timeInForce)
}
} else {
var marginMode interface{} = nil
marginModeparamsVariable := this.GetMarginMode(false, params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
// spot order
request = map[string]interface{} {
"currency_pair": GetValue(market, "id"),
"type": typeVar,
"account": marginMode,
"side": side,
}
if IsTrue(IsTrue(isMarketOrder) && IsTrue((IsEqual(side, "buy")))) {
var quoteAmount interface{} = nil
var createMarketBuyOrderRequiresPrice interface{} = true
createMarketBuyOrderRequiresPriceparamsVariable := this.HandleOptionAndParams(params, "createOrder", "createMarketBuyOrderRequiresPrice", true);
createMarketBuyOrderRequiresPrice = GetValue(createMarketBuyOrderRequiresPriceparamsVariable,0);
params = GetValue(createMarketBuyOrderRequiresPriceparamsVariable,1)
var cost interface{} = this.SafeNumber(params, "cost")
params = this.Omit(params, "cost")
if IsTrue(!IsEqual(cost, nil)) {
quoteAmount = 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 (quote quantity) in the amount argument")))
} else {
var amountString interface{} = this.NumberToString(amount)
var priceString interface{} = this.NumberToString(price)
var costRequest interface{} = Precise.StringMul(amountString, priceString)
quoteAmount = this.CostToPrecision(symbol, costRequest)
}
} else {
quoteAmount = this.CostToPrecision(symbol, amount)
}
AddElementToObject(request, "amount", quoteAmount)
} else {
AddElementToObject(request, "amount", this.AmountToPrecision(symbol, amount))
}
if IsTrue(isLimitOrder) {
AddElementToObject(request, "price", this.PriceToPrecision(symbol, price))
}
if IsTrue(!IsEqual(timeInForce, nil)) {
AddElementToObject(request, "time_in_force", timeInForce)
}
}
var clientOrderId interface{} = this.SafeString2(params, "text", "clientOrderId")
var textIsRequired interface{} = this.SafeBool(params, "textIsRequired", false)
if IsTrue(!IsEqual(clientOrderId, nil)) {
// user-defined, must follow the rules if not empty
// prefixed with t-
// no longer than 28 bytes without t- prefix
// can only include 0-9, A-Z, a-z, underscores (_), hyphens (-) or dots (.)
if IsTrue(IsGreaterThan(GetLength(clientOrderId), 28)) {
panic(BadRequest(Add(this.Id, " createOrder () clientOrderId or text param must be up to 28 characters")))
}
params = this.Omit(params, []interface{}{"text", "clientOrderId", "textIsRequired"})
if IsTrue(!IsEqual(GetValue(clientOrderId, 0), "t")) {
clientOrderId = Add("t-", clientOrderId)
}
AddElementToObject(request, "text", clientOrderId)
} else {
if IsTrue(textIsRequired) {
// batchOrders requires text in the request
AddElementToObject(request, "text", Add("t-", this.Uuid16()))
}
}
} else {
if IsTrue(GetValue(market, "option")) {
panic(NotSupported(Add(this.Id, " createOrder() conditional option orders are not supported")))
}
if IsTrue(contract) {
// contract conditional order
request = map[string]interface{} {
"initial": map[string]interface{} {
"contract": GetValue(market, "id"),
"size": amount,
},
"settle": GetValue(market, "settleId"),
}
if IsTrue(IsEqual(typeVar, "market")) {
AddElementToObject(GetValue(request, "initial"), "price", "0")
} else {
AddElementToObject(GetValue(request, "initial"), "price", Ternary(IsTrue((IsEqual(price, 0))), "0", this.PriceToPrecision(symbol, price)))
}
if IsTrue(IsEqual(trigger, nil)) {
var rule interface{} = nil
var triggerOrderPrice interface{} = nil
if IsTrue(isStopLossOrder) {
// we let trigger orders be aliases for stopLoss orders because
// gateio doesn't accept conventional trigger orders for spot markets
rule = Ternary(IsTrue((IsEqual(side, "buy"))), 1, 2)
triggerOrderPrice = this.PriceToPrecision(symbol, stopLossPrice)
} else if IsTrue(isTakeProfitOrder) {
rule = Ternary(IsTrue((IsEqual(side, "buy"))), 2, 1)
triggerOrderPrice = this.PriceToPrecision(symbol, takeProfitPrice)
}
var priceType interface{} = this.SafeInteger(params, "price_type", 0)
if IsTrue(IsTrue(IsLessThan(priceType, 0)) || IsTrue(IsGreaterThan(priceType, 2))) {
panic(BadRequest(Add(this.Id, " createOrder () price_type should be 0 latest deal price, 1 mark price, 2 index price")))
}
params = this.Omit(params, []interface{}{"price_type"})
AddElementToObject(request, "trigger", map[string]interface{} {
"price_type": priceType,
"price": this.PriceToPrecision(symbol, triggerOrderPrice),
"rule": rule,
})
}
if IsTrue(!IsEqual(reduceOnly, nil)) {
AddElementToObject(GetValue(request, "initial"), "reduce_only", reduceOnly)
}
if IsTrue(!IsEqual(timeInForce, nil)) {
AddElementToObject(GetValue(request, "initial"), "tif", timeInForce)
}
} else {
// spot conditional order
var options interface{} = this.SafeValue(this.Options, "createOrder", map[string]interface{} {})
var marginMode interface{} = nil
marginModeparamsVariable := this.GetMarginMode(true, params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
if IsTrue(IsEqual(timeInForce, nil)) {
timeInForce = "gtc"
}
request = map[string]interface{} {
"put": map[string]interface{} {
"type": typeVar,
"side": side,
"price": this.PriceToPrecision(symbol, price),
"amount": this.AmountToPrecision(symbol, amount),
"account": marginMode,
"time_in_force": timeInForce,
},
"market": GetValue(market, "id"),
}
if IsTrue(IsEqual(trigger, nil)) {
var defaultExpiration interface{} = this.SafeInteger(options, "expiration")
var expiration interface{} = this.SafeInteger(params, "expiration", defaultExpiration)
var rule interface{} = nil
var triggerOrderPrice interface{} = nil
if IsTrue(isStopLossOrder) {
// we let trigger orders be aliases for stopLoss orders because
// gateio doesn't accept conventional trigger orders for spot markets
rule = Ternary(IsTrue((IsEqual(side, "buy"))), ">=", "<=")
triggerOrderPrice = this.PriceToPrecision(symbol, stopLossPrice)
} else if IsTrue(isTakeProfitOrder) {
rule = Ternary(IsTrue((IsEqual(side, "buy"))), "<=", ">=")
triggerOrderPrice = this.PriceToPrecision(symbol, takeProfitPrice)
}
AddElementToObject(request, "trigger", map[string]interface{} {
"price": this.PriceToPrecision(symbol, triggerOrderPrice),
"rule": rule,
"expiration": expiration,
})
}
}
}
return this.Extend(request, params)
}
/**
* @method
* @name gate#createMarketBuyOrderWithCost
* @description create a market buy order by providing the symbol and cost
* @see https://www.gate.io/docs/developers/apiv4/en/#create-an-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
* @param {bool} [params.unifiedAccount] set to true for creating a unified account order
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes45648 := (<-this.LoadMarkets())
PanicOnError(retRes45648)
retRes45658 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes45658)
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "spot")) {
panic(NotSupported(Add(this.Id, " createMarketBuyOrderWithCost() supports spot orders only")))
}
AddElementToObject(params, "createMarketBuyOrderRequiresPrice", false)
retRes457115 := (<-this.CreateOrder(symbol, "market", "buy", cost, nil, params))
PanicOnError(retRes457115)
ch <- retRes457115
return nil
}()
return ch
}
func (this *gate) EditOrderRequest(id interface{}, symbol interface{}, typeVar interface{}, side interface{}, optionalArgs ...interface{}) interface{} {
amount := GetArg(optionalArgs, 0, nil)
_ = amount
price := GetArg(optionalArgs, 1, nil)
_ = price
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
var market interface{} = this.Market(symbol)
var marketType interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("editOrder", market, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
var account interface{} = this.ConvertTypeToAccount(marketType)
var isUnifiedAccount interface{} = false
isUnifiedAccountparamsVariable := this.HandleOptionAndParams(params, "editOrder", "unifiedAccount");
isUnifiedAccount = GetValue(isUnifiedAccountparamsVariable,0);
params = GetValue(isUnifiedAccountparamsVariable,1)
if IsTrue(isUnifiedAccount) {
account = "unified"
}
var isLimitOrder interface{} = (IsEqual(typeVar, "limit"))
if IsTrue(IsEqual(account, "spot")) {
if !IsTrue(isLimitOrder) {
panic(InvalidOrder(Add(Add(Add(Add(Add(this.Id, " editOrder() does not support "), typeVar), " orders for "), marketType), " markets")))
}
}
var request interface{} = map[string]interface{} {
"order_id": ToString(id),
"currency_pair": GetValue(market, "id"),
"account": account,
}
if IsTrue(!IsEqual(amount, nil)) {
if IsTrue(GetValue(market, "spot")) {
AddElementToObject(request, "amount", this.AmountToPrecision(symbol, amount))
} else {
if IsTrue(IsEqual(side, "sell")) {
AddElementToObject(request, "size", this.ParseToNumeric(Precise.StringNeg(this.AmountToPrecision(symbol, amount))))
} else {
AddElementToObject(request, "size", this.ParseToNumeric(this.AmountToPrecision(symbol, amount)))
}
}
}
if IsTrue(!IsEqual(price, nil)) {
AddElementToObject(request, "price", this.PriceToPrecision(symbol, price))
}
if !IsTrue(GetValue(market, "spot")) {
AddElementToObject(request, "settle", GetValue(market, "settleId"))
}
return this.Extend(request, params)
}
/**
* @method
* @name gate#editOrder
* @description edit a trade order, gate currently only supports the modification of the price or amount fields
* @see https://www.gate.io/docs/developers/apiv4/en/#amend-an-order
* @see https://www.gate.io/docs/developers/apiv4/en/#amend-an-order-2
* @param {string} id 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 of the currency 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 {bool} [params.unifiedAccount] set to true for editing an order in a unified account
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes46338 := (<-this.LoadMarkets())
PanicOnError(retRes46338)
retRes46348 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes46348)
var market interface{} = this.Market(symbol)
var extendedRequest interface{} = this.EditOrderRequest(id, symbol, typeVar, side, amount, price, params)
var response interface{} = nil
if IsTrue(GetValue(market, "spot")) {
response = (<-this.PrivateSpotPatchOrdersOrderId(extendedRequest))
PanicOnError(response)
} else {
response = (<-this.PrivateFuturesPutSettleOrdersOrderId(extendedRequest))
PanicOnError(response)
}
//
// {
// "id": "243233276443",
// "text": "apiv4",
// "create_time": "1670908873",
// "update_time": "1670914102",
// "create_time_ms": 1670908873077,
// "update_time_ms": 1670914102241,
// "status": "open",
// "currency_pair": "ADA_USDT",
// "type": "limit",
// "account": "spot",
// "side": "sell",
// "amount": "10",
// "price": "0.6",
// "time_in_force": "gtc",
// "iceberg": "0",
// "left": "10",
// "fill_price": "0",
// "filled_total": "0",
// "fee": "0",
// "fee_currency": "USDT",
// "point_fee": "0",
// "gt_fee": "0",
// "gt_maker_fee": "0",
// "gt_taker_fee": "0",
// "gt_discount": false,
// "rebated_fee": "0",
// "rebated_fee_currency": "ADA"
// }
//
ch <- this.ParseOrder(response, market)
return nil
}()
return ch
}
func (this *gate) ParseOrderStatus(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"open": "open",
"_new": "open",
"filled": "closed",
"cancelled": "canceled",
"liquidated": "closed",
"ioc": "canceled",
"failed": "canceled",
"expired": "canceled",
"finished": "closed",
"finish": "closed",
"succeeded": "closed",
}
return this.SafeString(statuses, status, status)
}
func (this *gate) ParseOrder(order interface{}, optionalArgs ...interface{}) interface{} {
//
// SPOT
// createOrder/cancelOrder/fetchOrder/editOrder
//
// {
// "id": "62364648575",
// "text": "apiv4",
// "create_time": "1626354834",
// "update_time": "1626354834",
// "create_time_ms": "1626354833544",
// "update_time_ms": "1626354833544",
// "status": "open",
// "currency_pair": "BTC_USDT",
// "type": "limit",
// "account": "spot",
// "side": "buy",
// "amount": "0.0001",
// "price": "30000",
// "time_in_force": "gtc",
// "iceberg": "0",
// "left": "0.0001",
// "fill_price": "0",
// "filled_total": "0",
// "fee": "0",
// "fee_currency": "BTC",
// "point_fee": "0",
// "gt_fee": "0",
// "gt_discount": true,
// "rebated_fee": "0",
// "rebated_fee_currency": "USDT"
// }
//
// SPOT TRIGGER ORDERS
// createOrder
//
// {
// "id": 12604556
// }
//
// fetchOrder/cancelOrder
//
// {
// "market": "ADA_USDT",
// "user": 6392049,
// "trigger": {
// "price": "1.08", // stopPrice
// "rule": "\u003e=",
// "expiration": 86400
// },
// "put": {
// "type": "limit",
// "side": "buy",
// "price": "1.08", // order price
// "amount": "1.00000000000000000000",
// "account": "normal",
// "time_in_force": "gtc"
// },
// "id": 71639298,
// "ctime": 1643945985,
// "status": "open"
// }
//
// FUTURE, SWAP AND OPTION
// createOrder/cancelOrder/fetchOrder
//
// {
// "id": 123028481731,
// "contract": "ADA_USDT",
// "mkfr": "-0.00005",
// "tkfr": "0.00048",
// "tif": "ioc",
// "is_reduce_only": false,
// "create_time": 1643950262.68,
// "finish_time": 1643950262.68,
// "price": "0",
// "size": 1,
// "refr": "0",
// "left":0,
// "text": "api",
// "fill_price": "1.05273",
// "user":6329238,
// "finish_as": "filled",
// "status": "finished",
// "is_liq": false,
// "refu":0,
// "is_close": false,
// "iceberg": 0
// }
//
// TRIGGER ORDERS (FUTURE AND SWAP)
// createOrder
//
// {
// "id": 12604556
// }
//
// fetchOrder/cancelOrder
//
// {
// "user": 6320300,
// "trigger": {
// "strategy_type": 0,
// "price_type": 0,
// "price": "1.03", // stopPrice
// "rule": 2,
// "expiration": 0
// },
// "initial": {
// "contract": "ADA_USDT",
// "size": -1,
// "price": "1.02",
// "tif": "gtc",
// "text": "",
// "iceberg": 0,
// "is_close": false,
// "is_reduce_only": false,
// "auto_size": ""
// },
// "id": 126393906,
// "trade_id": 0,
// "status": "open",
// "reason": "",
// "create_time": 1643953482,
// "finish_time": 1643953482,
// "is_stop_order": false,
// "stop_trigger": {
// "rule": 0,
// "trigger_price": "",
// "order_price": ""
// },
// "me_order_id": 0,
// "order_type": ""
// }
//
// {
// "text": "t-d18baf9ac44d82e2",
// "succeeded": false,
// "label": "BALANCE_NOT_ENOUGH",
// "message": "Not enough balance"
// }
//
// {"user_id":10406147,"id":"id","succeeded":false,"message":"INVALID_PROTOCOL","label":"INVALID_PROTOCOL"}
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var succeeded interface{} = this.SafeBool(order, "succeeded", true)
if !IsTrue(succeeded) {
// cancelOrders response
return this.SafeOrder(map[string]interface{} {
"clientOrderId": this.SafeString(order, "text"),
"info": order,
"status": "rejected",
"id": this.SafeString(order, "id"),
})
}
var put interface{} = this.SafeValue2(order, "put", "initial", map[string]interface{} {})
var trigger interface{} = this.SafeValue(order, "trigger", map[string]interface{} {})
var contract interface{} = this.SafeString(put, "contract")
var typeVar interface{} = this.SafeString(put, "type")
var timeInForce interface{} = this.SafeStringUpper2(put, "time_in_force", "tif")
var amount interface{} = this.SafeString2(put, "amount", "size")
var side interface{} = this.SafeString(put, "side")
var price interface{} = this.SafeString(put, "price")
contract = this.SafeString(order, "contract", contract)
typeVar = this.SafeString(order, "type", typeVar)
timeInForce = this.SafeStringUpper2(order, "time_in_force", "tif", timeInForce)
if IsTrue(IsEqual(timeInForce, "POC")) {
timeInForce = "PO"
}
var postOnly interface{} = (IsEqual(timeInForce, "PO"))
amount = this.SafeString2(order, "amount", "size", amount)
side = this.SafeString(order, "side", side)
price = this.SafeString(order, "price", price)
var remainingString interface{} = this.SafeString(order, "left")
var cost interface{} = this.SafeString(order, "filled_total")
var triggerPrice interface{} = this.SafeNumber(trigger, "price")
var average interface{} = this.SafeNumber2(order, "avg_deal_price", "fill_price")
if IsTrue(triggerPrice) {
remainingString = amount
cost = "0"
}
if IsTrue(contract) {
var isMarketOrder interface{} = IsTrue(Precise.StringEquals(price, "0")) && IsTrue((IsEqual(timeInForce, "IOC")))
typeVar = Ternary(IsTrue(isMarketOrder), "market", "limit")
side = Ternary(IsTrue(Precise.StringGt(amount, "0")), "buy", "sell")
}
var rawStatus interface{} = this.SafeStringN(order, []interface{}{"finish_as", "status", "open"})
var timestamp interface{} = this.SafeInteger(order, "create_time_ms")
if IsTrue(IsEqual(timestamp, nil)) {
timestamp = this.SafeTimestamp2(order, "create_time", "ctime")
}
var lastTradeTimestamp interface{} = this.SafeInteger(order, "update_time_ms")
if IsTrue(IsEqual(lastTradeTimestamp, nil)) {
lastTradeTimestamp = this.SafeTimestamp2(order, "update_time", "finish_time")
}
var marketType interface{} = "contract"
if IsTrue(IsTrue((InOp(order, "currency_pair"))) || IsTrue((InOp(order, "market")))) {
marketType = "spot"
}
var exchangeSymbol interface{} = this.SafeString2(order, "currency_pair", "market", contract)
var symbol interface{} = this.SafeSymbol(exchangeSymbol, market, "_", marketType)
// Everything below this(above return) is related to fees
var fees interface{} = []interface{}{}
var gtFee interface{} = this.SafeString(order, "gt_fee")
if IsTrue(!IsEqual(gtFee, nil)) {
AppendToArray(&fees,map[string]interface{} {
"currency": "GT",
"cost": gtFee,
})
}
var fee interface{} = this.SafeString(order, "fee")
if IsTrue(!IsEqual(fee, nil)) {
AppendToArray(&fees,map[string]interface{} {
"currency": this.SafeCurrencyCode(this.SafeString(order, "fee_currency")),
"cost": fee,
})
}
var rebate interface{} = this.SafeString(order, "rebated_fee")
if IsTrue(!IsEqual(rebate, nil)) {
AppendToArray(&fees,map[string]interface{} {
"currency": this.SafeCurrencyCode(this.SafeString(order, "rebated_fee_currency")),
"cost": Precise.StringNeg(rebate),
})
}
var numFeeCurrencies interface{} = GetArrayLength(fees)
var multipleFeeCurrencies interface{} = IsGreaterThan(numFeeCurrencies, 1)
var status interface{} = this.ParseOrderStatus(rawStatus)
var remaining interface{} = Precise.StringAbs(remainingString)
// handle spot market buy
var account interface{} = this.SafeString(order, "account") // using this instead of market type because of the conflicting ids
if IsTrue(IsEqual(account, "spot")) {
var averageString interface{} = this.SafeString(order, "avg_deal_price")
average = this.ParseNumber(averageString)
if IsTrue(IsTrue((IsEqual(typeVar, "market"))) && IsTrue((IsEqual(side, "buy")))) {
remaining = Precise.StringDiv(remainingString, averageString)
price = nil // arrives as 0
cost = amount
amount = Precise.StringDiv(amount, averageString)
}
}
return this.SafeOrder(map[string]interface{} {
"id": this.SafeString(order, "id"),
"clientOrderId": this.SafeString(order, "text"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"lastTradeTimestamp": lastTradeTimestamp,
"status": status,
"symbol": symbol,
"type": typeVar,
"timeInForce": timeInForce,
"postOnly": postOnly,
"reduceOnly": this.SafeValue(order, "is_reduce_only"),
"side": side,
"price": price,
"triggerPrice": triggerPrice,
"average": average,
"amount": Precise.StringAbs(amount),
"cost": Precise.StringAbs(cost),
"filled": nil,
"remaining": remaining,
"fee": Ternary(IsTrue(multipleFeeCurrencies), nil, this.SafeValue(fees, 0)),
"fees": Ternary(IsTrue(multipleFeeCurrencies), fees, []interface{}{}),
"trades": nil,
"info": order,
}, market)
}
func (this *gate) FetchOrderRequest(id interface{}, optionalArgs ...interface{}) interface{} {
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
var market interface{} = Ternary(IsTrue((IsEqual(symbol, nil))), nil, this.Market(symbol))
var trigger interface{} = this.SafeBoolN(params, []interface{}{"trigger", "is_stop_order", "stop"}, false)
params = this.Omit(params, []interface{}{"is_stop_order", "stop", "trigger"})
var clientOrderId interface{} = this.SafeString2(params, "text", "clientOrderId")
var orderId interface{} = id
if IsTrue(!IsEqual(clientOrderId, nil)) {
params = this.Omit(params, []interface{}{"text", "clientOrderId"})
if IsTrue(!IsEqual(GetValue(clientOrderId, 0), "t")) {
clientOrderId = Add("t-", clientOrderId)
}
orderId = clientOrderId
}
typeVarqueryVariable := this.HandleMarketTypeAndParams("fetchOrder", market, params);
typeVar := GetValue(typeVarqueryVariable,0);
query := GetValue(typeVarqueryVariable,1)
var contract interface{} = IsTrue(IsTrue((IsEqual(typeVar, "swap"))) || IsTrue((IsEqual(typeVar, "future")))) || IsTrue((IsEqual(typeVar, "option")))
requestrequestParamsVariable := Ternary(IsTrue(contract), this.PrepareRequest(market, typeVar, query), this.SpotOrderPrepareRequest(market, trigger, query));
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
AddElementToObject(request, "order_id", ToString(orderId))
return []interface{}{request, requestParams}
}
/**
* @method
* @name gate#fetchOrder
* @description Retrieves information on an order
* @see https://www.gate.io/docs/developers/apiv4/en/#get-a-single-order
* @see https://www.gate.io/docs/developers/apiv4/en/#get-a-single-order-2
* @see https://www.gate.io/docs/developers/apiv4/en/#get-a-single-order-3
* @see https://www.gate.io/docs/developers/apiv4/en/#get-a-single-order-4
* @param {string} id Order id
* @param {string} symbol Unified market symbol, *required for spot and margin*
* @param {object} [params] Parameters specified by the exchange api
* @param {bool} [params.trigger] True if the order being fetched is a trigger order
* @param {string} [params.marginMode] 'cross' or 'isolated' - marginMode for margin trading if not provided this.options['defaultMarginMode'] is used
* @param {string} [params.type] 'spot', 'swap', or 'future', if not provided this.options['defaultMarginMode'] is used
* @param {string} [params.settle] 'btc' or 'usdt' - settle currency for perpetual swap and future - market settle currency is used if symbol !== undefined, default="usdt" for swap and "btc" for future
* @param {bool} [params.unifiedAccount] set to true for fetching a unified account order
* @returns An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes49998 := (<-this.LoadMarkets())
PanicOnError(retRes49998)
retRes50008 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes50008)
var market interface{} = Ternary(IsTrue((IsEqual(symbol, nil))), nil, this.Market(symbol))
var result interface{} = this.HandleMarketTypeAndParams("fetchOrder", market, params)
var typeVar interface{} = this.SafeString(result, 0)
var trigger interface{} = this.SafeBoolN(params, []interface{}{"trigger", "is_stop_order", "stop"}, false)
requestrequestParamsVariable := this.FetchOrderRequest(id, symbol, params);
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
var response interface{} = nil
if IsTrue(IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "margin"))) {
if IsTrue(trigger) {
response = (<-this.PrivateSpotGetPriceOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotGetOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "swap")) {
if IsTrue(trigger) {
response = (<-this.PrivateFuturesGetSettlePriceOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateFuturesGetSettleOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "future")) {
if IsTrue(trigger) {
response = (<-this.PrivateDeliveryGetSettlePriceOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateDeliveryGetSettleOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "option")) {
response = (<-this.PrivateOptionsGetOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchOrder() not support this market type")))
}
ch <- this.ParseOrder(response, market)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchOpenOrders
* @description fetch all unfilled currently open orders
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-open-orders
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-running-auto-order-list
* @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 orders structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {bool} [params.trigger] true for fetching trigger orders
* @param {string} [params.type] spot, margin, swap or future, if not provided this.options['defaultType'] is used
* @param {string} [params.marginMode] 'cross' or 'isolated' - marginMode for type='margin', if not provided this.options['defaultMarginMode'] is used
* @param {bool} [params.unifiedAccount] set to true for fetching unified account orders
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes505015 := (<-this.FetchOrdersByStatus("open", symbol, since, limit, params))
PanicOnError(retRes505015)
ch <- retRes505015
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchClosedOrders
* @description fetches information on multiple closed orders made by the user
* @see https://www.gate.io/docs/developers/apiv4/en/#list-orders
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-running-auto-order-list
* @see https://www.gate.io/docs/developers/apiv4/en/#list-futures-orders
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-auto-orders
* @see https://www.gate.io/docs/developers/apiv4/en/#list-futures-orders-2
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-auto-orders-2
* @see https://www.gate.io/docs/developers/apiv4/en/#list-options-orders
* @see https://www.gate.io/docs/developers/apiv4/en/#list-futures-orders-by-time-range
* @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
* @param {bool} [params.trigger] true for fetching trigger orders
* @param {string} [params.type] spot, swap or future, if not provided this.options['defaultType'] is used
* @param {string} [params.marginMode] 'cross' or 'isolated' - marginMode for margin trading if not provided this.options['defaultMarginMode'] is used
* @param {boolean} [params.historical] *swap only* true for using historical endpoint
* @param {bool} [params.unifiedAccount] set to true for fetching unified account orders
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes50778 := (<-this.LoadMarkets())
PanicOnError(retRes50778)
retRes50788 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes50788)
var until interface{} = this.SafeInteger(params, "until")
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
symbol = GetValue(market, "symbol")
}
var res interface{} = this.HandleMarketTypeAndParams("fetchClosedOrders", market, params)
var typeVar interface{} = this.SafeString(res, 0)
var useHistorical interface{} = false
useHistoricalparamsVariable := this.HandleOptionAndParams(params, "fetchClosedOrders", "historical", false);
useHistorical = GetValue(useHistoricalparamsVariable,0);
params = GetValue(useHistoricalparamsVariable,1)
if IsTrue(!IsTrue(useHistorical) && IsTrue((IsTrue((IsTrue(IsEqual(since, nil)) && IsTrue(IsEqual(until, nil)))) || IsTrue((!IsEqual(typeVar, "swap")))))) {
retRes509019 := (<-this.FetchOrdersByStatus("finished", symbol, since, limit, params))
PanicOnError(retRes509019)
ch <- retRes509019
return nil
}
params = this.Omit(params, "type")
var request interface{} = map[string]interface{} {}
requestparamsVariable := this.PrepareRequest(market, typeVar, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
}
if IsTrue(!IsEqual(until, nil)) {
params = this.Omit(params, "until")
AddElementToObject(request, "to", this.ParseToInt(Divide(until, 1000)))
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PrivateFuturesGetSettleOrdersTimerange(this.Extend(request, params)))
PanicOnError(response)
ch <- this.ParseOrders(response, market, since, limit)
return nil
}()
return ch
}
func (this *gate) PrepareOrdersByStatusRequest(status interface{}, optionalArgs ...interface{}) interface{} {
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
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
symbol = GetValue(market, "symbol")
}
var trigger interface{} = nil
triggerparamsVariable := this.HandleParamBool2(params, "trigger", "stop");
trigger = GetValue(triggerparamsVariable,0);
params = GetValue(triggerparamsVariable,1)
var typeVar interface{} = nil
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchOrdersByStatus", market, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
var spot interface{} = IsTrue((IsEqual(typeVar, "spot"))) || IsTrue((IsEqual(typeVar, "margin")))
var request interface{} = map[string]interface{} {}
requestparamsVariable := Ternary(IsTrue(spot), this.MultiOrderSpotPrepareRequest(market, trigger, params), this.PrepareRequest(market, typeVar, params));
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(IsTrue(spot) && IsTrue(trigger)) {
request = this.Omit(request, "account")
}
if IsTrue(IsEqual(status, "closed")) {
status = "finished"
}
AddElementToObject(request, "status", status)
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(spot) {
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
}
var until interface{} = this.SafeInteger(params, "until")
if IsTrue(!IsEqual(until, nil)) {
params = this.Omit(params, "until")
AddElementToObject(request, "to", this.ParseToInt(Divide(until, 1000)))
}
}
lastIdfinalParamsVariable := this.HandleParamString2(params, "lastId", "last_id");
lastId := GetValue(lastIdfinalParamsVariable,0);
finalParams := GetValue(lastIdfinalParamsVariable,1)
if IsTrue(!IsEqual(lastId, nil)) {
AddElementToObject(request, "last_id", lastId)
}
return []interface{}{request, finalParams}
}
func (this *gate) FetchOrdersByStatus(status interface{}, 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
retRes51508 := (<-this.LoadMarkets())
PanicOnError(retRes51508)
retRes51518 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes51518)
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
symbol = GetValue(market, "symbol")
}
// don't omit here, omits done in prepareOrdersByStatusRequest
var trigger interface{} = this.SafeBool2(params, "trigger", "stop")
var res interface{} = this.HandleMarketTypeAndParams("fetchOrdersByStatus", market, params)
var typeVar interface{} = this.SafeString(res, 0)
requestrequestParamsVariable := this.PrepareOrdersByStatusRequest(status, symbol, since, limit, params);
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
var spot interface{} = IsTrue((IsEqual(typeVar, "spot"))) || IsTrue((IsEqual(typeVar, "margin")))
var openStatus interface{} = (IsEqual(status, "open"))
var openSpotOrders interface{} = IsTrue(IsTrue(spot) && IsTrue(openStatus)) && !IsTrue(trigger)
var response interface{} = nil
if IsTrue(spot) {
if !IsTrue(trigger) {
if IsTrue(openStatus) {
response = (<-this.PrivateSpotGetOpenOrders(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotGetOrders(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else {
response = (<-this.PrivateSpotGetPriceOrders(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "swap")) {
if IsTrue(trigger) {
response = (<-this.PrivateFuturesGetSettlePriceOrders(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateFuturesGetSettleOrders(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "future")) {
if IsTrue(trigger) {
response = (<-this.PrivateDeliveryGetSettlePriceOrders(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateDeliveryGetSettleOrders(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "option")) {
response = (<-this.PrivateOptionsGetOrders(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchOrders() not support this market type")))
}
//
// spot open orders
//
// [
// {
// "currency_pair": "ADA_USDT",
// "total": 2,
// "orders": [
// {
// "id": "155498539874",
// "text": "apiv4",
// "create_time": "1652406843",
// "update_time": "1652406843",
// "create_time_ms": 1652406843295,
// "update_time_ms": 1652406843295,
// "status": "open",
// "currency_pair": "ADA_USDT",
// "type": "limit",
// "account": "spot",
// "side": "buy",
// "amount": "3",
// "price": "0.35",
// "time_in_force": "gtc",
// "iceberg": "0",
// "left": "3",
// "fill_price": "0",
// "filled_total": "0",
// "fee": "0",
// "fee_currency": "ADA",
// "point_fee": "0",
// "gt_fee": "0",
// "gt_discount": false,
// "rebated_fee": "0",
// "rebated_fee_currency": "USDT"
// },
// ...
// ]
// },
// ...
// ]
//
// spot
//
// [
// {
// "id": "8834234273",
// "text": "3",
// "create_time": "1635406193",
// "update_time": "1635406193",
// "create_time_ms": 1635406193361,
// "update_time_ms": 1635406193361,
// "status": "closed",
// "currency_pair": "BTC_USDT",
// "type": "limit",
// "account": "spot", // margin for margin orders
// "side": "sell",
// "amount": "0.0002",
// "price": "58904.01",
// "time_in_force": "gtc",
// "iceberg": "0",
// "left": "0.0000",
// "fill_price": "11.790516",
// "filled_total": "11.790516",
// "fee": "0.023581032",
// "fee_currency": "USDT",
// "point_fee": "0",
// "gt_fee": "0",
// "gt_discount": false,
// "rebated_fee_currency": "BTC"
// }
// ]
//
// spot trigger
//
// [
// {
// "market": "ADA_USDT",
// "user": 10406147,
// "trigger": {
// "price": "0.65",
// "rule": "\u003c=",
// "expiration": 86400
// },
// "put": {
// "type": "limit",
// "side": "sell",
// "price": "0.65",
// "amount": "2.00000000000000000000",
// "account": "normal", // margin for margin orders
// "time_in_force": "gtc"
// },
// "id": 8449909,
// "ctime": 1652188982,
// "status": "open"
// }
// ]
//
// swap
//
// [
// {
// "status": "finished",
// "size": -1,
// "left": 0,
// "id": 82750739203,
// "is_liq": false,
// "is_close": false,
// "contract": "BTC_USDT",
// "text": "web",
// "fill_price": "60721.3",
// "finish_as": "filled",
// "iceberg": 0,
// "tif": "ioc",
// "is_reduce_only": true,
// "create_time": 1635403475.412,
// "finish_time": 1635403475.4127,
// "price": "0"
// }
// ]
//
// option
//
// [
// {
// "id": 2593450699,
// "contract": "BTC_USDT-20230601-27500-C",
// "mkfr": "0.0003",
// "tkfr": "0.0003",
// "tif": "gtc",
// "is_reduce_only": false,
// "create_time": 1685503873,
// "price": "200",
// "size": 1,
// "refr": "0",
// "left": 1,
// "text": "api",
// "fill_price": "0",
// "user": 5691076,
// "status": "open",
// "is_liq": false,
// "refu": 0,
// "is_close": false,
// "iceberg": 0
// }
// ]
//
var result interface{} = response
if IsTrue(openSpotOrders) {
result = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var ordersInner interface{} = this.SafeValue(GetValue(response, i), "orders")
result = this.ArrayConcat(result, ordersInner)
}
}
var orders interface{} = this.ParseOrders(result, market, since, limit)
ch <- this.FilterBySymbolSinceLimit(orders, symbol, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name gate#cancelOrder
* @description Cancels an open order
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-a-single-order
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-a-single-order-2
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-a-single-order-3
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-a-single-order-4
* @param {string} id Order id
* @param {string} symbol Unified market symbol
* @param {object} [params] Parameters specified by the exchange api
* @param {bool} [params.trigger] True if the order to be cancelled is a trigger order
* @param {bool} [params.unifiedAccount] set to true for canceling unified account orders
* @returns An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes53678 := (<-this.LoadMarkets())
PanicOnError(retRes53678)
retRes53688 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes53688)
var market interface{} = Ternary(IsTrue((IsEqual(symbol, nil))), nil, this.Market(symbol))
var trigger interface{} = this.SafeBoolN(params, []interface{}{"is_stop_order", "stop", "trigger"}, false)
params = this.Omit(params, []interface{}{"is_stop_order", "stop", "trigger"})
typeVarqueryVariable := this.HandleMarketTypeAndParams("cancelOrder", market, params);
typeVar := GetValue(typeVarqueryVariable,0);
query := GetValue(typeVarqueryVariable,1)
requestrequestParamsVariable := Ternary(IsTrue((IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "margin")))), this.SpotOrderPrepareRequest(market, trigger, query), this.PrepareRequest(market, typeVar, query));
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
AddElementToObject(request, "order_id", id)
var response interface{} = nil
if IsTrue(IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "margin"))) {
if IsTrue(trigger) {
response = (<-this.PrivateSpotDeletePriceOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotDeleteOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "swap")) {
if IsTrue(trigger) {
response = (<-this.PrivateFuturesDeleteSettlePriceOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateFuturesDeleteSettleOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "future")) {
if IsTrue(trigger) {
response = (<-this.PrivateDeliveryDeleteSettlePriceOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateDeliveryDeleteSettleOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "option")) {
response = (<-this.PrivateOptionsDeleteOrdersOrderId(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " cancelOrder() not support this market type")))
}
//
// spot
//
// {
// "id": "95282841887",
// "text": "apiv4",
// "create_time": "1637383156",
// "update_time": "1637383235",
// "create_time_ms": 1637383156017,
// "update_time_ms": 1637383235085,
// "status": "cancelled",
// "currency_pair": "ETH_USDT",
// "type": "limit",
// "account": "spot",
// "side": "buy",
// "amount": "0.01",
// "price": "3500",
// "time_in_force": "gtc",
// "iceberg": "0",
// "left": "0.01",
// "fill_price": "0",
// "filled_total": "0",
// "fee": "0",
// "fee_currency": "ETH",
// "point_fee": "0",
// "gt_fee": "0",
// "gt_discount": false,
// "rebated_fee": "0",
// "rebated_fee_currency": "USDT"
// }
//
// spot conditional
//
// {
// "market": "ETH_USDT",
// "user": 2436035,
// "trigger": {
// "price": "3500",
// "rule": "\u003c=",
// "expiration": 86400
// },
// "put": {
// "type": "limit",
// "side": "buy",
// "price": "3500",
// "amount": "0.01000000000000000000",
// "account": "normal",
// "time_in_force": "gtc"
// },
// "id": 5891843,
// "ctime": 1637382379,
// "ftime": 1637382673,
// "status": "canceled"
// }
//
// swap, future and option
//
// {
// "id": "82241928192",
// "contract": "BTC_USDT",
// "mkfr": "0",
// "tkfr": "0.0005",
// "tif": "gtc",
// "is_reduce_only": false,
// "create_time": "1635196145.06",
// "finish_time": "1635196233.396",
// "price": "61000",
// "size": "4",
// "refr": "0",
// "left": "4",
// "text": "web",
// "fill_price": "0",
// "user": "6693577",
// "finish_as": "cancelled",
// "status": "finished",
// "is_liq": false,
// "refu": "0",
// "is_close": false,
// "iceberg": "0",
// }
//
ch <- this.ParseOrder(response, market)
return nil
}()
return ch
}
/**
* @method
* @name gate#cancelOrders
* @description cancel multiple orders
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-a-batch-of-orders-with-an-id-list
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-a-batch-of-orders-with-an-id-list-2
* @param {string[]} ids order ids
* @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 {bool} [params.unifiedAccount] set to true for canceling unified account orders
* @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes54968 := (<-this.LoadMarkets())
PanicOnError(retRes54968)
retRes54978 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes54978)
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
}
var typeVar interface{} = nil
var defaultSettle interface{} = Ternary(IsTrue((IsEqual(market, nil))), "usdt", GetValue(market, "settle"))
var settle interface{} = this.SafeStringLower(params, "settle", defaultSettle)
typeVarparamsVariable := this.HandleMarketTypeAndParams("cancelOrders", market, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
var isSpot interface{} = (IsEqual(typeVar, "spot"))
if IsTrue(IsTrue(isSpot) && IsTrue((IsEqual(symbol, nil)))) {
panic(ArgumentsRequired(Add(this.Id, " cancelOrders requires a symbol argument for spot markets")))
}
if IsTrue(isSpot) {
var ordersRequests interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(ids)); i++ {
var id interface{} = GetValue(ids, i)
var orderItem interface{} = map[string]interface{} {
"id": id,
"symbol": symbol,
}
AppendToArray(&ordersRequests,orderItem)
}
retRes552019 := (<-this.CancelOrdersForSymbols(ordersRequests, params))
PanicOnError(retRes552019)
ch <- retRes552019
return nil
}
var request interface{} = map[string]interface{} {
"settle": settle,
}
var finalList interface{} = []interface{}{request} // hacky but needs to be done here
for i := 0; IsLessThan(i, GetArrayLength(ids)); i++ {
AppendToArray(&finalList,GetValue(ids, i))
}
response:= (<-this.PrivateFuturesPostSettleBatchCancelOrders(finalList))
PanicOnError(response)
ch <- this.ParseOrders(response)
return nil
}()
return ch
}
/**
* @method
* @name gate#cancelOrdersForSymbols
* @description cancel multiple orders for multiple symbols
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-a-batch-of-orders-with-an-id-list
* @param {CancellationRequest[]} orders list of order ids with symbol, example [{"id": "a", "symbol": "BTC/USDT"}, {"id": "b", "symbol": "ETH/USDT"}]
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string[]} [params.clientOrderIds] client order ids
* @param {bool} [params.unifiedAccount] set to true for canceling unified account orders
* @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) CancelOrdersForSymbols(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
retRes55458 := (<-this.LoadMarkets())
PanicOnError(retRes55458)
retRes55468 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes55468)
var ordersRequests interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(orders)); i++ {
var order interface{} = GetValue(orders, i)
var symbol interface{} = this.SafeString(order, "symbol")
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "spot")) {
panic(NotSupported(Add(this.Id, " cancelOrdersForSymbols() supports only spot markets")))
}
var id interface{} = this.SafeString(order, "id")
var orderItem interface{} = map[string]interface{} {
"id": id,
"currency_pair": GetValue(market, "id"),
}
AppendToArray(&ordersRequests,orderItem)
}
response:= (<-this.PrivateSpotPostCancelBatchOrders(ordersRequests))
PanicOnError(response)
//
// [
// {
// "currency_pair": "BTC_USDT",
// "id": "123456"
// }
// ]
//
ch <- this.ParseOrders(response)
return nil
}()
return ch
}
/**
* @method
* @name gate#cancelAllOrders
* @description cancel all open orders
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-all-open-orders-in-specified-currency-pair
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-all-open-orders-matched
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-all-open-orders-matched-2
* @see https://www.gate.io/docs/developers/apiv4/en/#cancel-all-open-orders-matched-3
* @param {string} symbol unified market symbol, only orders in the market of this symbol are cancelled when symbol is not undefined
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {bool} [params.unifiedAccount] set to true for canceling unified account orders
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *gate) 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
retRes55888 := (<-this.LoadMarkets())
PanicOnError(retRes55888)
retRes55898 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes55898)
var market interface{} = Ternary(IsTrue((IsEqual(symbol, nil))), nil, this.Market(symbol))
var trigger interface{} = this.SafeBool2(params, "stop", "trigger")
params = this.Omit(params, []interface{}{"stop", "trigger"})
typeVarqueryVariable := this.HandleMarketTypeAndParams("cancelAllOrders", market, params);
typeVar := GetValue(typeVarqueryVariable,0);
query := GetValue(typeVarqueryVariable,1)
requestrequestParamsVariable := Ternary(IsTrue((IsEqual(typeVar, "spot"))), this.MultiOrderSpotPrepareRequest(market, trigger, query), this.PrepareRequest(market, typeVar, query));
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
var response interface{} = nil
if IsTrue(IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "margin"))) {
if IsTrue(trigger) {
response = (<-this.PrivateSpotDeletePriceOrders(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateSpotDeleteOrders(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "swap")) {
if IsTrue(trigger) {
response = (<-this.PrivateFuturesDeleteSettlePriceOrders(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateFuturesDeleteSettleOrders(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "future")) {
if IsTrue(trigger) {
response = (<-this.PrivateDeliveryDeleteSettlePriceOrders(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
response = (<-this.PrivateDeliveryDeleteSettleOrders(this.Extend(request, requestParams)))
PanicOnError(response)
}
} else if IsTrue(IsEqual(typeVar, "option")) {
response = (<-this.PrivateOptionsDeleteOrders(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " cancelAllOrders() not support this market type")))
}
//
// [
// {
// "id": 139797004085,
// "contract": "ADA_USDT",
// "mkfr": "0",
// "tkfr": "0.0005",
// "tif": "gtc",
// "is_reduce_only": false,
// "create_time": 1647911169.343,
// "finish_time": 1647911226.849,
// "price": "0.8",
// "size": 1,
// "refr": "0.3",
// "left": 1,
// "text": "api",
// "fill_price": "0",
// "user": 6693577,
// "finish_as": "cancelled",
// "status": "finished",
// "is_liq": false,
// "refu": 2436035,
// "is_close": false,
// "iceberg": 0
// }
// ...
// ]
//
ch <- this.ParseOrders(response, market)
return nil
}()
return ch
}
/**
* @method
* @name gate#transfer
* @description transfer currency internally between wallets on the same account
* @see https://www.gate.io/docs/developers/apiv4/en/#transfer-between-trading-accounts
* @param {string} code unified currency code for currency being transferred
* @param {float} amount the amount of currency to transfer
* @param {string} fromAccount the account to transfer currency from
* @param {string} toAccount the account to transfer currency to
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.symbol] Unified market symbol *required for type == margin*
* @returns A [transfer structure]{@link https://docs.ccxt.com/#/?id=transfer-structure}
*/
func (this *gate) 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
retRes56648 := (<-this.LoadMarkets())
PanicOnError(retRes56648)
var currency interface{} = this.Currency(code)
var fromId interface{} = this.ConvertTypeToAccount(fromAccount)
var toId interface{} = this.ConvertTypeToAccount(toAccount)
var truncated interface{} = this.CurrencyToPrecision(code, amount)
var request interface{} = map[string]interface{} {
"currency": GetValue(currency, "id"),
"amount": truncated,
}
if !IsTrue((InOp(GetValue(this.Options, "accountsByType"), fromId))) {
AddElementToObject(request, "from", "margin")
AddElementToObject(request, "currency_pair", fromId)
} else {
AddElementToObject(request, "from", fromId)
}
if !IsTrue((InOp(GetValue(this.Options, "accountsByType"), toId))) {
AddElementToObject(request, "to", "margin")
AddElementToObject(request, "currency_pair", toId)
} else {
AddElementToObject(request, "to", toId)
}
if IsTrue(IsTrue(IsEqual(fromId, "margin")) || IsTrue(IsEqual(toId, "margin"))) {
var symbol interface{} = this.SafeString2(params, "symbol", "currency_pair")
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " transfer requires params[\"symbol\"] for isolated margin transfers")))
}
var market interface{} = this.Market(symbol)
AddElementToObject(request, "currency_pair", GetValue(market, "id"))
params = this.Omit(params, "symbol")
}
if IsTrue(IsTrue(IsTrue(IsTrue((IsEqual(toId, "futures"))) || IsTrue((IsEqual(toId, "delivery")))) || IsTrue((IsEqual(fromId, "futures")))) || IsTrue((IsEqual(fromId, "delivery")))) {
AddElementToObject(request, "settle", GetValue(currency, "id")) // todo: currencies have network-junctions
}
response:= (<-this.PrivateWalletPostTransfers(this.Extend(request, params)))
PanicOnError(response)
//
// according to the docs (however actual response seems to be an empty string '')
//
// {
// "currency": "BTC",
// "from": "spot",
// "to": "margin",
// "amount": "1",
// "currency_pair": "BTC_USDT"
// }
//
ch <- this.ParseTransfer(response, currency)
return nil
}()
return ch
}
func (this *gate) ParseTransfer(transfer interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "currency": "BTC",
// "from": "spot",
// "to": "margin",
// "amount": "1",
// "currency_pair": "BTC_USDT"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
return map[string]interface{} {
"id": this.SafeString(transfer, "tx_id"),
"timestamp": nil,
"datetime": nil,
"currency": this.SafeCurrencyCode(nil, currency),
"amount": nil,
"fromAccount": nil,
"toAccount": nil,
"status": nil,
"info": transfer,
}
}
/**
* @method
* @name gate#setLeverage
* @description set the level of leverage for a market
* @see https://www.gate.io/docs/developers/apiv4/en/#update-position-leverage
* @see https://www.gate.io/docs/developers/apiv4/en/#update-position-leverage-2
* @param {float} leverage the rate of leverage
* @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 *gate) 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")))
}
// WARNING: THIS WILL INCREASE LIQUIDATION PRICE FOR OPEN ISOLATED LONG POSITIONS
// AND DECREASE LIQUIDATION PRICE FOR OPEN ISOLATED SHORT POSITIONS
if IsTrue(IsTrue((IsLessThan(leverage, 0))) || IsTrue((IsGreaterThan(leverage, 100)))) {
panic(BadRequest(Add(this.Id, " setLeverage() leverage should be between 1 and 100")))
}
retRes57558 := (<-this.LoadMarkets())
PanicOnError(retRes57558)
var market interface{} = this.Market(symbol)
requestqueryVariable := this.PrepareRequest(market, nil, params);
request := GetValue(requestqueryVariable,0);
query := GetValue(requestqueryVariable,1)
var defaultMarginMode interface{} = this.SafeString2(this.Options, "marginMode", "defaultMarginMode")
var crossLeverageLimit interface{} = this.SafeString(query, "cross_leverage_limit")
var marginMode interface{} = this.SafeString(query, "marginMode", defaultMarginMode)
var stringifiedMargin interface{} = this.NumberToString(leverage)
if IsTrue(!IsEqual(crossLeverageLimit, nil)) {
marginMode = "cross"
stringifiedMargin = crossLeverageLimit
}
if IsTrue(IsTrue(IsEqual(marginMode, "cross")) || IsTrue(IsEqual(marginMode, "cross_margin"))) {
AddElementToObject(request, "cross_leverage_limit", stringifiedMargin)
AddElementToObject(request, "leverage", "0")
} else {
AddElementToObject(request, "leverage", stringifiedMargin)
}
var response interface{} = nil
if IsTrue(GetValue(market, "swap")) {
response = (<-this.PrivateFuturesPostSettlePositionsContractLeverage(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "future")) {
response = (<-this.PrivateDeliveryPostSettlePositionsContractLeverage(this.Extend(request, query)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " setLeverage() not support this market type")))
}
//
// {
// "value": "0",
// "leverage": "5",
// "mode": "single",
// "realised_point": "0",
// "contract": "BTC_USDT",
// "entry_price": "0",
// "mark_price": "62035.86",
// "history_point": "0",
// "realised_pnl": "0",
// "close_order": null,
// "size": 0,
// "cross_leverage_limit": "0",
// "pending_orders": 0,
// "adl_ranking": 6,
// "maintenance_rate": "0.005",
// "unrealised_pnl": "0",
// "user": 2436035,
// "leverage_max": "100",
// "history_pnl": "0",
// "risk_limit": "1000000",
// "margin": "0",
// "last_close_pnl": "0",
// "liq_price": "0"
// }
//
ch <- response
return nil
}()
return ch
}
func (this *gate) ParsePosition(position interface{}, optionalArgs ...interface{}) interface{} {
//
// swap and future
//
// {
// "value": "4.60516",
// "leverage": "0",
// "mode": "single",
// "realised_point": "0",
// "contract": "BTC_USDT",
// "entry_price": "46030.3",
// "mark_price": "46051.6",
// "history_point": "0",
// "realised_pnl": "-0.002301515",
// "close_order": null,
// "size": 1,
// "cross_leverage_limit": "0",
// "pending_orders": 0,
// "adl_ranking": 5,
// "maintenance_rate": "0.004",
// "unrealised_pnl": "0.00213",
// "user": 5691076,
// "leverage_max": "125",
// "history_pnl": "0",
// "risk_limit": "1000000",
// "margin": "8.997698485",
// "last_close_pnl": "0",
// "liq_price": "0",
// "update_time": 1705034246,
// "update_id": 1,
// "initial_margin": "0",
// "maintenance_margin": "0",
// "open_time": 1705034246,
// "trade_max_size": "0"
// }
//
// option
//
// {
// "close_order": null,
// "size": 1,
// "vega": "5.29756",
// "theta": "-98.98917",
// "gamma": "0.00056",
// "delta": "0.68691",
// "contract": "BTC_USDT-20230602-26500-C",
// "entry_price": "529",
// "unrealised_pnl": "-1.0131",
// "user": 5691076,
// "mark_price": "427.69",
// "underlying_price": "26810.2",
// "underlying": "BTC_USDT",
// "realised_pnl": "-0.08042877",
// "mark_iv": "0.4224",
// "pending_orders": 0
// }
//
// fetchPositionsHistory (swap and future)
//
// {
// "contract": "SLERF_USDT", // Futures contract
// "text": "web", // Text of close order
// "long_price": "0.766306", // When 'side' is 'long,' it indicates the opening average price; when 'side' is 'short,' it indicates the closing average price.
// "pnl": "-23.41702352", // PNL
// "pnl_pnl": "-22.7187", // Position P/L
// "pnl_fee": "-0.06527125", // Transaction Fees
// "pnl_fund": "-0.63305227", // Funding Fees
// "accum_size": "100",
// "time": 1711279263, // Position close time
// "short_price": "0.539119", // When 'side' is 'long,' it indicates the opening average price; when 'side' is 'short,' it indicates the closing average price
// "side": "long", // Position side, long or short
// "max_size": "100", // Max Trade Size
// "first_open_time": 1711037985 // First Open Time
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var contract interface{} = this.SafeString(position, "contract")
market = this.SafeMarket(contract, market, "_", "contract")
var size interface{} = this.SafeString2(position, "size", "accum_size")
var side interface{} = this.SafeString(position, "side")
if IsTrue(IsEqual(side, nil)) {
if IsTrue(Precise.StringGt(size, "0")) {
side = "long"
} else if IsTrue(Precise.StringLt(size, "0")) {
side = "short"
}
}
var maintenanceRate interface{} = this.SafeString(position, "maintenance_rate")
var notional interface{} = this.SafeString(position, "value")
var leverage interface{} = this.SafeString(position, "leverage")
var marginMode interface{} = nil
if IsTrue(!IsEqual(leverage, nil)) {
if IsTrue(IsEqual(leverage, "0")) {
marginMode = "cross"
} else {
marginMode = "isolated"
}
}
// Initial Position Margin = ( Position Value / Leverage ) + Close Position Fee
// *The default leverage under the full position is the highest leverage in the market.
// *Trading fee is charged as Taker Fee Rate (0.075%).
var feePaid interface{} = this.SafeString(position, "pnl_fee")
var initialMarginString interface{} = nil
if IsTrue(IsEqual(feePaid, nil)) {
var takerFee interface{} = "0.00075"
feePaid = Precise.StringMul(takerFee, notional)
initialMarginString = Precise.StringAdd(Precise.StringDiv(notional, leverage), feePaid)
}
var timestamp interface{} = this.SafeTimestamp2(position, "open_time", "first_open_time")
if IsTrue(IsEqual(timestamp, 0)) {
timestamp = nil
}
return this.SafePosition(map[string]interface{} {
"info": position,
"id": nil,
"symbol": this.SafeString(market, "symbol"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"lastUpdateTimestamp": this.SafeTimestamp2(position, "update_time", "time"),
"initialMargin": this.ParseNumber(initialMarginString),
"initialMarginPercentage": this.ParseNumber(Precise.StringDiv(initialMarginString, notional)),
"maintenanceMargin": this.ParseNumber(Precise.StringMul(maintenanceRate, notional)),
"maintenanceMarginPercentage": this.ParseNumber(maintenanceRate),
"entryPrice": this.SafeNumber(position, "entry_price"),
"notional": this.ParseNumber(notional),
"leverage": this.SafeNumber(position, "leverage"),
"unrealizedPnl": this.SafeNumber(position, "unrealised_pnl"),
"realizedPnl": this.SafeNumber2(position, "realised_pnl", "pnl"),
"contracts": this.ParseNumber(Precise.StringAbs(size)),
"contractSize": this.SafeNumber(market, "contractSize"),
"marginRatio": nil,
"liquidationPrice": this.SafeNumber(position, "liq_price"),
"markPrice": this.SafeNumber(position, "mark_price"),
"lastPrice": nil,
"collateral": this.SafeNumber(position, "margin"),
"marginMode": marginMode,
"side": side,
"percentage": nil,
"stopLossPrice": nil,
"takeProfitPrice": nil,
})
}
/**
* @method
* @name gate#fetchPosition
* @description fetch data on an open contract position
* @see https://www.gate.io/docs/developers/apiv4/en/#get-single-position
* @see https://www.gate.io/docs/developers/apiv4/en/#get-single-position-2
* @see https://www.gate.io/docs/developers/apiv4/en/#get-specified-contract-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 *gate) 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
retRes59648 := (<-this.LoadMarkets())
PanicOnError(retRes59648)
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "contract")) {
panic(BadRequest(Add(this.Id, " fetchPosition() supports contract markets only")))
}
var request interface{} = map[string]interface{} {}
requestparamsVariable := this.PrepareRequest(market, GetValue(market, "type"), params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
var extendedRequest interface{} = this.Extend(request, params)
var response interface{} = nil
if IsTrue(GetValue(market, "swap")) {
response = (<-this.PrivateFuturesGetSettlePositionsContract(extendedRequest))
PanicOnError(response)
} else if IsTrue(GetValue(market, "future")) {
response = (<-this.PrivateDeliveryGetSettlePositionsContract(extendedRequest))
PanicOnError(response)
} else if IsTrue(IsEqual(GetValue(market, "type"), "option")) {
response = (<-this.PrivateOptionsGetPositionsContract(extendedRequest))
PanicOnError(response)
}
//
// swap and future
//
// {
// "value": "4.60516",
// "leverage": "0",
// "mode": "single",
// "realised_point": "0",
// "contract": "BTC_USDT",
// "entry_price": "46030.3",
// "mark_price": "46051.6",
// "history_point": "0",
// "realised_pnl": "-0.002301515",
// "close_order": null,
// "size": 1,
// "cross_leverage_limit": "0",
// "pending_orders": 0,
// "adl_ranking": 5,
// "maintenance_rate": "0.004",
// "unrealised_pnl": "0.00213",
// "user": 5691076,
// "leverage_max": "125",
// "history_pnl": "0",
// "risk_limit": "1000000",
// "margin": "8.997698485",
// "last_close_pnl": "0",
// "liq_price": "0",
// "update_time": 1705034246,
// "update_id": 1,
// "initial_margin": "0",
// "maintenance_margin": "0",
// "open_time": 1705034246,
// "trade_max_size": "0"
// }
//
// option
//
// {
// "close_order": null,
// "size": 1,
// "vega": "5.29756",
// "theta": "-98.98917",
// "gamma": "0.00056",
// "delta": "0.68691",
// "contract": "BTC_USDT-20230602-26500-C",
// "entry_price": "529",
// "unrealised_pnl": "-1.0131",
// "user": 5691076,
// "mark_price": "427.69",
// "underlying_price": "26810.2",
// "underlying": "BTC_USDT",
// "realised_pnl": "-0.08042877",
// "mark_iv": "0.4224",
// "pending_orders": 0
// }
//
ch <- this.ParsePosition(response, market)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchPositions
* @description fetch all open positions
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-positions-of-a-user
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-positions-of-a-user-2
* @see https://www.gate.io/docs/developers/apiv4/en/#list-user-s-positions-of-specified-underlying
* @param {string[]|undefined} symbols Not used by gate, but parsed internally by CCXT
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.settle] 'btc' or 'usdt' - settle currency for perpetual swap and future - default="usdt" for swap and "btc" for future
* @param {string} [params.type] swap, future or option, if not provided this.options['defaultType'] is used
* @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *gate) 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
retRes60538 := (<-this.LoadMarkets())
PanicOnError(retRes60538)
var market interface{} = nil
symbols = this.MarketSymbols(symbols, nil, true, true, true)
if IsTrue(!IsEqual(symbols, nil)) {
var symbolsLength interface{} = GetArrayLength(symbols)
if IsTrue(IsGreaterThan(symbolsLength, 0)) {
market = this.Market(GetValue(symbols, 0))
}
}
var typeVar interface{} = nil
var request interface{} = map[string]interface{} {}
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchPositions", market, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
if IsTrue(IsTrue((IsEqual(typeVar, nil))) || IsTrue((IsEqual(typeVar, "spot")))) {
typeVar = "swap" // default to swap
}
if IsTrue(IsEqual(typeVar, "option")) {
if IsTrue(!IsEqual(symbols, nil)) {
var marketId interface{} = GetValue(market, "id")
var optionParts interface{} = Split(marketId, "-")
AddElementToObject(request, "underlying", this.SafeString(optionParts, 0))
}
} else {
requestparamsVariable := this.PrepareRequest(nil, typeVar, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
}
var response interface{} = nil
if IsTrue(IsEqual(typeVar, "swap")) {
response = (<-this.PrivateFuturesGetSettlePositions(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "future")) {
response = (<-this.PrivateDeliveryGetSettlePositions(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "option")) {
response = (<-this.PrivateOptionsGetPositions(this.Extend(request, params)))
PanicOnError(response)
}
//
// swap and future
//
// [
// {
// "value": "4.602828",
// "leverage": "0",
// "mode": "single",
// "realised_point": "0",
// "contract": "BTC_USDT",
// "entry_price": "46030.3",
// "mark_price": "46028.28",
// "history_point": "0",
// "realised_pnl": "-0.002301515",
// "close_order": null,
// "size": 1,
// "cross_leverage_limit": "0",
// "pending_orders": 0,
// "adl_ranking": 5,
// "maintenance_rate": "0.004",
// "unrealised_pnl": "-0.000202",
// "user": 5691076,
// "leverage_max": "125",
// "history_pnl": "0",
// "risk_limit": "1000000",
// "margin": "8.997698485",
// "last_close_pnl": "0",
// "liq_price": "0",
// "update_time": 1705034246,
// "update_id": 1,
// "initial_margin": "0",
// "maintenance_margin": "0",
// "open_time": 1705034246,
// "trade_max_size": "0"
// }
// ]
//
// option
//
// [
// {
// "close_order": null,
// "size": 0,
// "vega": "0.01907",
// "theta": "-3.04888",
// "gamma": "0.00001",
// "delta": "0.0011",
// "contract": "BTC_USDT-20230601-27500-C",
// "entry_price": "0",
// "unrealised_pnl": "0",
// "user": 5691076,
// "mark_price": "0.07",
// "underlying_price": "26817.27",
// "underlying": "BTC_USDT",
// "realised_pnl": "0",
// "mark_iv": "0.4339",
// "pending_orders": 0
// }
// ]
//
ch <- this.ParsePositions(response, symbols)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchLeverageTiers
* @description retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-futures-contracts-2
* @param {string[]} [symbols] list of unified market symbols
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a dictionary of [leverage tiers structures]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure}, indexed by market symbols
*/
func (this *gate) FetchLeverageTiers(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
retRes61598 := (<-this.LoadMarkets())
PanicOnError(retRes61598)
typeVarqueryVariable := this.HandleMarketTypeAndParams("fetchLeverageTiers", nil, params);
typeVar := GetValue(typeVarqueryVariable,0);
query := GetValue(typeVarqueryVariable,1)
requestrequestParamsVariable := this.PrepareRequest(nil, typeVar, query);
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
if IsTrue(IsTrue(!IsEqual(typeVar, "future")) && IsTrue(!IsEqual(typeVar, "swap"))) {
panic(BadRequest(Add(this.Id, " fetchLeverageTiers only supports swap and future")))
}
var response interface{} = nil
if IsTrue(IsEqual(typeVar, "swap")) {
response = (<-this.PublicFuturesGetSettleContracts(this.Extend(request, requestParams)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "future")) {
response = (<-this.PublicDeliveryGetSettleContracts(this.Extend(request, requestParams)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchLeverageTiers() not support this market type")))
}
//
// Perpetual swap
//
// [
// {
// "name": "BTC_USDT",
// "type": "direct",
// "quanto_multiplier": "0.0001",
// "ref_discount_rate": "0",
// "order_price_deviate": "0.5",
// "maintenance_rate": "0.005",
// "mark_type": "index",
// "last_price": "38026",
// "mark_price": "37985.6",
// "index_price": "37954.92",
// "funding_rate_indicative": "0.000219",
// "mark_price_round": "0.01",
// "funding_offset": 0,
// "in_delisting": false,
// "risk_limit_base": "1000000",
// "interest_rate": "0.0003",
// "order_price_round": "0.1",
// "order_size_min": 1,
// "ref_rebate_rate": "0.2",
// "funding_interval": 28800,
// "risk_limit_step": "1000000",
// "leverage_min": "1",
// "leverage_max": "100",
// "risk_limit_max": "8000000",
// "maker_fee_rate": "-0.00025",
// "taker_fee_rate": "0.00075",
// "funding_rate": "0.002053",
// "order_size_max": 1000000,
// "funding_next_apply": 1610035200,
// "short_users": 977,
// "config_change_time": 1609899548,
// "trade_size": 28530850594,
// "position_size": 5223816,
// "long_users": 455,
// "funding_impact_value": "60000",
// "orders_limit": 50,
// "trade_id": 10851092,
// "orderbook_id": 2129638396
// }
// ]
//
// Delivery Futures
//
// [
// {
// "name": "BTC_USDT_20200814",
// "underlying": "BTC_USDT",
// "cycle": "WEEKLY",
// "type": "direct",
// "quanto_multiplier": "0.0001",
// "mark_type": "index",
// "last_price": "9017",
// "mark_price": "9019",
// "index_price": "9005.3",
// "basis_rate": "0.185095",
// "basis_value": "13.7",
// "basis_impact_value": "100000",
// "settle_price": "0",
// "settle_price_interval": 60,
// "settle_price_duration": 1800,
// "settle_fee_rate": "0.0015",
// "expire_time": 1593763200,
// "order_price_round": "0.1",
// "mark_price_round": "0.1",
// "leverage_min": "1",
// "leverage_max": "100",
// "maintenance_rate": "1000000",
// "risk_limit_base": "140.726652109199",
// "risk_limit_step": "1000000",
// "risk_limit_max": "8000000",
// "maker_fee_rate": "-0.00025",
// "taker_fee_rate": "0.00075",
// "ref_discount_rate": "0",
// "ref_rebate_rate": "0.2",
// "order_price_deviate": "0.5",
// "order_size_min": 1,
// "order_size_max": 1000000,
// "orders_limit": 50,
// "orderbook_id": 63,
// "trade_id": 26,
// "trade_size": 435,
// "position_size": 130,
// "config_change_time": 1593158867,
// "in_delisting": false
// }
// ]
//
ch <- this.ParseLeverageTiers(response, symbols, "name")
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchMarketLeverageTiers
* @description retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes for a single market
* @see https://www.gate.io/docs/developers/apiv4/en/#list-risk-limit-tiers
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [leverage tiers structure]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure}
*/
func (this *gate) 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
retRes62788 := (<-this.LoadMarkets())
PanicOnError(retRes62788)
var market interface{} = this.Market(symbol)
typeVarqueryVariable := this.HandleMarketTypeAndParams("fetchMarketLeverageTiers", market, params);
typeVar := GetValue(typeVarqueryVariable,0);
query := GetValue(typeVarqueryVariable,1)
requestrequestParamsVariable := this.PrepareRequest(market, typeVar, query);
request := GetValue(requestrequestParamsVariable,0);
requestParams := GetValue(requestrequestParamsVariable,1)
if IsTrue(IsTrue(!IsEqual(typeVar, "future")) && IsTrue(!IsEqual(typeVar, "swap"))) {
panic(BadRequest(Add(this.Id, " fetchMarketLeverageTiers only supports swap and future")))
}
response:= (<-this.PrivateFuturesGetSettleRiskLimitTiers(this.Extend(request, requestParams)))
PanicOnError(response)
//
// [
// {
// "maintenance_rate": "0.004",
// "tier": 1,
// "initial_rate": "0.008",
// "leverage_max": "125",
// "risk_limit": "1000000"
// }
// ]
//
ch <- this.ParseMarketLeverageTiers(response, market)
return nil
}()
return ch
}
func (this *gate) ParseEmulatedLeverageTiers(info interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(info, "name")
var maintenanceMarginUnit interface{} = this.SafeString(info, "maintenance_rate") // '0.005',
var leverageMax interface{} = this.SafeString(info, "leverage_max") // '100',
var riskLimitStep interface{} = this.SafeString(info, "risk_limit_step") // '1000000',
var riskLimitMax interface{} = this.SafeString(info, "risk_limit_max") // '16000000',
var initialMarginUnit interface{} = Precise.StringDiv("1", leverageMax)
var maintenanceMarginRate interface{} = maintenanceMarginUnit
var initialMarginRatio interface{} = initialMarginUnit
var floor interface{} = "0"
var tiers interface{} = []interface{}{}
for Precise.StringLt(floor, riskLimitMax) {
var cap interface{} = Precise.StringAdd(floor, riskLimitStep)
AppendToArray(&tiers,map[string]interface{} {
"tier": this.ParseNumber(Precise.StringDiv(cap, riskLimitStep)),
"symbol": this.SafeSymbol(marketId, market, nil, "contract"),
"currency": this.SafeString(market, "settle"),
"minNotional": this.ParseNumber(floor),
"maxNotional": this.ParseNumber(cap),
"maintenanceMarginRate": this.ParseNumber(maintenanceMarginRate),
"maxLeverage": this.ParseNumber(Precise.StringDiv("1", initialMarginRatio)),
"info": info,
})
maintenanceMarginRate = Precise.StringAdd(maintenanceMarginRate, maintenanceMarginUnit)
initialMarginRatio = Precise.StringAdd(initialMarginRatio, initialMarginUnit)
floor = cap
}
return tiers
}
func (this *gate) ParseMarketLeverageTiers(info interface{}, optionalArgs ...interface{}) interface{} {
//
// [
// {
// "maintenance_rate": "0.004",
// "tier": 1,
// "initial_rate": "0.008",
// "leverage_max": "125",
// "risk_limit": "1000000"
// }
// ]
//
market := GetArg(optionalArgs, 0, nil)
_ = market
if !IsTrue(IsArray(info)) {
return this.ParseEmulatedLeverageTiers(info, market)
}
var minNotional interface{} = 0
var tiers interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(info)); i++ {
var item interface{} = GetValue(info, i)
var maxNotional interface{} = this.SafeNumber(item, "risk_limit")
AppendToArray(&tiers,map[string]interface{} {
"tier": this.Sum(i, 1),
"symbol": GetValue(market, "symbol"),
"currency": GetValue(market, "base"),
"minNotional": minNotional,
"maxNotional": maxNotional,
"maintenanceMarginRate": this.SafeNumber(item, "maintenance_rate"),
"maxLeverage": this.SafeNumber(item, "leverage_max"),
"info": item,
})
minNotional = maxNotional
}
return tiers
}
/**
* @method
* @name gate#repayMargin
* @description repay borrowed margin and interest
* @see https://www.gate.io/docs/apiv4/en/#repay-a-loan
* @param {string} symbol unified market symbol
* @param {string} code unified currency code of the currency to repay
* @param {float} amount the amount to repay
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.mode] 'all' or 'partial' payment mode, extra parameter required for isolated margin
* @param {string} [params.id] '34267567' loan id, extra parameter required for isolated margin
* @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
*/
func (this *gate) 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
retRes63798 := (<-this.LoadMarkets())
PanicOnError(retRes63798)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"currency": ToUpper(GetValue(currency, "id")),
"amount": this.CurrencyToPrecision(code, amount),
}
var market interface{} = this.Market(symbol)
AddElementToObject(request, "currency_pair", GetValue(market, "id"))
AddElementToObject(request, "type", "repay")
response:= (<-this.PrivateMarginPostUniLoans(this.Extend(request, params)))
PanicOnError(response)
//
// empty response
//
ch <- this.ParseMarginLoan(response, currency)
return nil
}()
return ch
}
/**
* @method
* @name gate#repayCrossMargin
* @description repay cross margin borrowed margin and interest
* @see https://www.gate.io/docs/developers/apiv4/en/#cross-margin-repayments
* @see https://www.gate.io/docs/developers/apiv4/en/#borrow-or-repay
* @param {string} code unified currency code of the currency to repay
* @param {float} amount the amount to repay
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.mode] 'all' or 'partial' payment mode, extra parameter required for isolated margin
* @param {string} [params.id] '34267567' loan id, extra parameter required for isolated margin
* @param {boolean} [params.unifiedAccount] set to true for repaying in the unified account
* @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
*/
func (this *gate) 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
retRes64108 := (<-this.LoadMarkets())
PanicOnError(retRes64108)
retRes64118 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes64118)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"currency": ToUpper(GetValue(currency, "id")),
"amount": this.CurrencyToPrecision(code, amount),
}
var isUnifiedAccount interface{} = false
isUnifiedAccountparamsVariable := this.HandleOptionAndParams(params, "repayCrossMargin", "unifiedAccount");
isUnifiedAccount = GetValue(isUnifiedAccountparamsVariable,0);
params = GetValue(isUnifiedAccountparamsVariable,1)
var response interface{} = nil
if IsTrue(isUnifiedAccount) {
AddElementToObject(request, "type", "repay")
response = (<-this.PrivateUnifiedPostLoans(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateMarginPostCrossRepayments(this.Extend(request, params)))
PanicOnError(response)
response = this.SafeDict(response, 0)
}
ch <- this.ParseMarginLoan(response, currency)
return nil
}()
return ch
}
/**
* @method
* @name gate#borrowIsolatedMargin
* @description create a loan to borrow margin
* @see https://www.gate.io/docs/developers/apiv4/en/#marginuni
* @param {string} symbol unified market symbol, required for isolated margin
* @param {string} code unified currency code of the currency to borrow
* @param {float} amount the amount to borrow
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.rate] '0.0002' or '0.002' extra parameter required for isolated margin
* @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
*/
func (this *gate) 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
retRes64598 := (<-this.LoadMarkets())
PanicOnError(retRes64598)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"currency": ToUpper(GetValue(currency, "id")),
"amount": this.CurrencyToPrecision(code, amount),
}
var response interface{} = nil
var market interface{} = this.Market(symbol)
AddElementToObject(request, "currency_pair", GetValue(market, "id"))
AddElementToObject(request, "type", "borrow")
response = (<-this.PrivateMarginPostUniLoans(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "id": "34267567",
// "create_time": "1656394778",
// "expire_time": "1657258778",
// "status": "loaned",
// "side": "borrow",
// "currency": "USDT",
// "rate": "0.0002",
// "amount": "100",
// "days": 10,
// "auto_renew": false,
// "currency_pair": "LTC_USDT",
// "left": "0",
// "repaid": "0",
// "paid_interest": "0",
// "unpaid_interest": "0.003333333333"
// }
//
ch <- this.ParseMarginLoan(response, currency)
return nil
}()
return ch
}
/**
* @method
* @name gate#borrowMargin
* @description create a loan to borrow margin
* @see https://www.gate.io/docs/apiv4/en/#create-a-cross-margin-borrow-loan
* @see https://www.gate.io/docs/developers/apiv4/en/#borrow-or-repay
* @param {string} code unified currency code of the currency to borrow
* @param {float} amount the amount to borrow
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.rate] '0.0002' or '0.002' extra parameter required for isolated margin
* @param {boolean} [params.unifiedAccount] set to true for borrowing in the unified account
* @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure}
*/
func (this *gate) 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
retRes65068 := (<-this.LoadMarkets())
PanicOnError(retRes65068)
retRes65078 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes65078)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"currency": ToUpper(GetValue(currency, "id")),
"amount": this.CurrencyToPrecision(code, amount),
}
var isUnifiedAccount interface{} = false
isUnifiedAccountparamsVariable := this.HandleOptionAndParams(params, "borrowCrossMargin", "unifiedAccount");
isUnifiedAccount = GetValue(isUnifiedAccountparamsVariable,0);
params = GetValue(isUnifiedAccountparamsVariable,1)
var response interface{} = nil
if IsTrue(isUnifiedAccount) {
AddElementToObject(request, "type", "borrow")
response = (<-this.PrivateUnifiedPostLoans(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PrivateMarginPostCrossLoans(this.Extend(request, params)))
PanicOnError(response)
}
ch <- this.ParseMarginLoan(response, currency)
return nil
}()
return ch
}
func (this *gate) ParseMarginLoan(info interface{}, optionalArgs ...interface{}) interface{} {
//
// Cross
//
// {
// "id": "17",
// "create_time": 1620381696159,
// "update_time": 1620381696159,
// "currency": "EOS",
// "amount": "110.553635",
// "text": "web",
// "status": 2,
// "repaid": "110.506649705159",
// "repaid_interest": "0.046985294841",
// "unpaid_interest": "0.0000074393366667"
// }
//
// Isolated
//
// {
// "id": "34267567",
// "create_time": "1656394778",
// "expire_time": "1657258778",
// "status": "loaned",
// "side": "borrow",
// "currency": "USDT",
// "rate": "0.0002",
// "amount": "100",
// "days": 10,
// "auto_renew": false,
// "currency_pair": "LTC_USDT",
// "left": "0",
// "repaid": "0",
// "paid_interest": "0",
// "unpaid_interest": "0.003333333333"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var marginMode interface{} = this.SafeString2(this.Options, "defaultMarginMode", "marginMode", "cross")
var timestamp interface{} = this.SafeInteger(info, "create_time")
if IsTrue(IsEqual(marginMode, "isolated")) {
timestamp = this.SafeTimestamp(info, "create_time")
}
var currencyId interface{} = this.SafeString(info, "currency")
var marketId interface{} = this.SafeString(info, "currency_pair")
return map[string]interface{} {
"id": this.SafeInteger(info, "id"),
"currency": this.SafeCurrencyCode(currencyId, currency),
"amount": this.SafeNumber(info, "amount"),
"symbol": this.SafeSymbol(marketId, nil, "_", "margin"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"info": info,
}
}
/**
* @method
* @name gate#fetchBorrowInterest
* @description fetch the interest owed by the user for borrowing currency for margin trading
* @see https://www.gate.io/docs/developers/apiv4/en/#list-interest-records
* @see https://www.gate.io/docs/developers/apiv4/en/#interest-records-for-the-cross-margin-account
* @see https://www.gate.io/docs/developers/apiv4/en/#list-interest-records-2
* @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.unifiedAccount] set to true for fetching borrow interest in the unified account
* @returns {object[]} a list of [borrow interest structures]{@link https://docs.ccxt.com/#/?id=borrow-interest-structure}
*/
func (this *gate) 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
retRes66108 := (<-this.LoadMarkets())
PanicOnError(retRes66108)
retRes66118 := (<-this.LoadUnifiedStatus())
PanicOnError(retRes66118)
var isUnifiedAccount interface{} = false
isUnifiedAccountparamsVariable := this.HandleOptionAndParams(params, "fetchBorrowInterest", "unifiedAccount");
isUnifiedAccount = GetValue(isUnifiedAccountparamsVariable,0);
params = GetValue(isUnifiedAccountparamsVariable,1)
var request interface{} = map[string]interface{} {}
requestparamsVariable := this.HandleUntilOption("to", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
var currency interface{} = nil
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "currency", GetValue(currency, "id"))
}
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", since)
}
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(isUnifiedAccount) {
response = (<-this.PrivateUnifiedGetInterestRecords(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "isolated")) {
if IsTrue(!IsEqual(market, nil)) {
AddElementToObject(request, "currency_pair", GetValue(market, "id"))
}
response = (<-this.PrivateMarginGetUniInterestRecords(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marginMode, "cross")) {
response = (<-this.PrivateMarginGetCrossInterestRecords(this.Extend(request, params)))
PanicOnError(response)
}
var interest interface{} = this.ParseBorrowInterests(response, market)
ch <- this.FilterByCurrencySinceLimit(interest, code, since, limit)
return nil
}()
return ch
}
func (this *gate) ParseBorrowInterest(info interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(info, "currency_pair")
market = this.SafeMarket(marketId, market)
var marginMode interface{} = Ternary(IsTrue((!IsEqual(marketId, nil))), "isolated", "cross")
var timestamp interface{} = this.SafeInteger(info, "create_time")
return map[string]interface{} {
"info": info,
"symbol": this.SafeString(market, "symbol"),
"currency": this.SafeCurrencyCode(this.SafeString(info, "currency")),
"interest": this.SafeNumber(info, "interest"),
"interestRate": this.SafeNumber(info, "actual_rate"),
"amountBorrowed": nil,
"marginMode": marginMode,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
}
}
func (this *gate) Nonce() interface{} {
return Subtract(this.Milliseconds(), GetValue(this.Options, "timeDifference"))
}
func (this *gate) 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 authentication interface{} = GetValue(api, 0) // public, private
var typeVar interface{} = GetValue(api, 1) // spot, margin, future, delivery
var query interface{} = this.Omit(params, this.ExtractParams(path))
var containsSettle interface{} = IsGreaterThan(GetIndexOf(path, "settle"), OpNeg(1))
if IsTrue(IsTrue(containsSettle) && IsTrue(EndsWith(path, "batch_cancel_orders"))) {
// special case where we need to extract the settle from the path
// but the body is an array of strings
var settle interface{} = this.SafeDict(params, 0)
path = this.ImplodeParams(path, settle)
// remove the first element from params
var newParams interface{} = []interface{}{}
var anyParams interface{} = params
for i := 1; IsLessThan(i, GetArrayLength(anyParams)); i++ {
AppendToArray(&newParams,GetValue(params, i))
}
params = newParams
query = newParams
} else if IsTrue(IsArray(params)) {
// endpoints like createOrders use an array instead of an object
// so we infer the settle from one of the elements
// they have to be all the same so relying on the first one is fine
var first interface{} = this.SafeValue(params, 0, map[string]interface{} {})
path = this.ImplodeParams(path, first)
} else {
path = this.ImplodeParams(path, params)
}
var endPart interface{} = Ternary(IsTrue((IsEqual(path, ""))), "", (Add("/", path)))
var entirePath interface{} = Add(Add("/", typeVar), endPart)
if IsTrue(IsTrue((IsEqual(typeVar, "subAccounts"))) || IsTrue((IsEqual(typeVar, "withdrawals")))) {
entirePath = endPart
}
var url interface{} = GetValue(GetValue(GetValue(this.Urls, "api"), authentication), typeVar)
if IsTrue(IsEqual(url, nil)) {
panic(NotSupported(Add(Add(Add(this.Id, " does not have a testnet for the "), typeVar), " market type.")))
}
url = Add(url, entirePath)
if IsTrue(IsEqual(authentication, "public")) {
if IsTrue(GetArrayLength(ObjectKeys(query))) {
url = Add(url, Add("?", this.Urlencode(query)))
}
} else {
this.CheckRequiredCredentials()
var queryString interface{} = ""
var requiresURLEncoding interface{} = false
if IsTrue(IsTrue((IsTrue((IsEqual(typeVar, "futures"))) || IsTrue((IsEqual(typeVar, "delivery"))))) && IsTrue(IsEqual(method, "POST"))) {
var pathParts interface{} = Split(path, "/")
var secondPart interface{} = this.SafeString(pathParts, 1, "")
requiresURLEncoding = IsTrue((IsGreaterThanOrEqual(GetIndexOf(secondPart, "dual"), 0))) || IsTrue((IsGreaterThanOrEqual(GetIndexOf(secondPart, "positions"), 0)))
}
if IsTrue(IsTrue(IsTrue(IsTrue((IsEqual(method, "GET"))) || IsTrue((IsEqual(method, "DELETE")))) || IsTrue(requiresURLEncoding)) || IsTrue((IsEqual(method, "PATCH")))) {
if IsTrue(GetArrayLength(ObjectKeys(query))) {
queryString = this.Urlencode(query)
url = Add(url, Add("?", queryString))
}
if IsTrue(IsEqual(method, "PATCH")) {
body = this.Json(query)
}
} else {
var urlQueryParams interface{} = this.SafeValue(query, "query", map[string]interface{} {})
if IsTrue(GetArrayLength(ObjectKeys(urlQueryParams))) {
queryString = this.Urlencode(urlQueryParams)
url = Add(url, Add("?", queryString))
}
query = this.Omit(query, "query")
body = this.Json(query)
}
var bodyPayload interface{} = Ternary(IsTrue((IsEqual(body, nil))), "", body)
var bodySignature interface{} = this.Hash(this.Encode(bodyPayload), sha512)
var nonce interface{} = this.Nonce()
var timestamp interface{} = this.ParseToInt(Divide(nonce, 1000))
var timestampString interface{} = ToString(timestamp)
var signaturePath interface{} = Add(Add("/api/", this.Version), entirePath)
var payloadArray interface{} = []interface{}{ToUpper(method), signaturePath, queryString, bodySignature, timestampString}
// eslint-disable-next-line quotes
var payload interface{} = Join(payloadArray, "\n")
var signature interface{} = this.Hmac(this.Encode(payload), this.Encode(this.Secret), sha512)
headers = map[string]interface{} {
"KEY": this.ApiKey,
"Timestamp": timestampString,
"SIGN": signature,
"Content-Type": "application/json",
}
}
return map[string]interface{} {
"url": url,
"method": method,
"body": body,
"headers": headers,
}
}
func (this *gate) ModifyMarginHelper(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
retRes67588 := (<-this.LoadMarkets())
PanicOnError(retRes67588)
var market interface{} = this.Market(symbol)
requestqueryVariable := this.PrepareRequest(market, nil, params);
request := GetValue(requestqueryVariable,0);
query := GetValue(requestqueryVariable,1)
AddElementToObject(request, "change", this.NumberToString(amount))
var response interface{} = nil
if IsTrue(GetValue(market, "swap")) {
response = (<-this.PrivateFuturesPostSettlePositionsContractMargin(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "future")) {
response = (<-this.PrivateDeliveryPostSettlePositionsContractMargin(this.Extend(request, query)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " modifyMarginHelper() not support this market type")))
}
ch <- this.ParseMarginModification(response, market)
return nil
}()
return ch
}
func (this *gate) ParseMarginModification(data interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "value": "11.9257",
// "leverage": "5",
// "mode": "single",
// "realised_point": "0",
// "contract": "ETH_USDT",
// "entry_price": "1203.45",
// "mark_price": "1192.57",
// "history_point": "0",
// "realised_pnl": "-0.00577656",
// "close_order": null,
// "size": "1",
// "cross_leverage_limit": "0",
// "pending_orders": "0",
// "adl_ranking": "5",
// "maintenance_rate": "0.005",
// "unrealised_pnl": "-0.1088",
// "user": "1486602",
// "leverage_max": "100",
// "history_pnl": "0",
// "risk_limit": "1000000",
// "margin": "5.415925875",
// "last_close_pnl": "0",
// "liq_price": "665.69"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var contract interface{} = this.SafeString(data, "contract")
market = this.SafeMarket(contract, market, "_", "contract")
var total interface{} = this.SafeNumber(data, "margin")
return map[string]interface{} {
"info": data,
"symbol": GetValue(market, "symbol"),
"type": nil,
"marginMode": "isolated",
"amount": nil,
"total": total,
"code": this.SafeValue(market, "quote"),
"status": "ok",
"timestamp": nil,
"datetime": nil,
}
}
/**
* @method
* @name gate#reduceMargin
* @description remove margin from a position
* @see https://www.gate.io/docs/developers/apiv4/en/#update-position-margin
* @see https://www.gate.io/docs/developers/apiv4/en/#update-position-margin-2
* @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 *gate) 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
retRes683015 := (<-this.ModifyMarginHelper(symbol, OpNeg(amount), params))
PanicOnError(retRes683015)
ch <- retRes683015
return nil
}()
return ch
}
/**
* @method
* @name gate#addMargin
* @description add margin
* @see https://www.gate.io/docs/developers/apiv4/en/#update-position-margin
* @see https://www.gate.io/docs/developers/apiv4/en/#update-position-margin-2
* @param {string} symbol unified market symbol
* @param {float} amount 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 *gate) 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
retRes684515 := (<-this.ModifyMarginHelper(symbol, amount, params))
PanicOnError(retRes684515)
ch <- retRes684515
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchOpenInterest
* @description Retrieves the open interest of a currency
* @see https://www.gate.io/docs/developers/apiv4/en/#futures-stats
* @param {string} symbol Unified CCXT market symbol
* @param {string} timeframe "5m", "15m", "30m", "1h", "4h", "1d"
* @param {int} [since] the time(ms) of the earliest record to retrieve as a unix timestamp
* @param {int} [limit] default 30
* @param {object} [params] exchange specific parameters
* @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} an open interest structure{@link https://docs.ccxt.com/#/?id=open-interest-structure}
*/
func (this *gate) FetchOpenInterestHistory(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
timeframe := GetArg(optionalArgs, 0, "5m")
_ = timeframe
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes68628 := (<-this.LoadMarkets())
PanicOnError(retRes68628)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchOpenInterestHistory", "paginate", false);
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes686619 := (<-this.FetchPaginatedCallDeterministic("fetchOpenInterestHistory", symbol, since, limit, timeframe, params, 100))
PanicOnError(retRes686619)
ch <- retRes686619
return nil
}
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "swap")) {
panic(BadRequest(Add(this.Id, " fetchOpenInterest() supports swap markets only")))
}
var request interface{} = map[string]interface{} {
"contract": GetValue(market, "id"),
"settle": GetValue(market, "settleId"),
"interval": this.SafeString(this.Timeframes, timeframe, timeframe),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", since)
}
response:= (<-this.PublicFuturesGetSettleContractStats(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// "long_liq_size": "0",
// "short_liq_size": "0",
// "short_liq_usd": "0",
// "lsr_account": "3.2808988764045",
// "mark_price": "0.34619",
// "top_lsr_size": "0",
// "time": "1674057000",
// "short_liq_amount": "0",
// "long_liq_amount": "0",
// "open_interest_usd": "9872386.7775",
// "top_lsr_account": "0",
// "open_interest": "2851725",
// "long_liq_usd": "0",
// "lsr_taker": "9.3765153315902"
// },
// ...
// ]
//
ch <- this.ParseOpenInterestsHistory(response, market, since, limit)
return nil
}()
return ch
}
func (this *gate) ParseOpenInterest(interest interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "long_liq_size": "0",
// "short_liq_size": "0",
// "short_liq_usd": "0",
// "lsr_account": "3.2808988764045",
// "mark_price": "0.34619",
// "top_lsr_size": "0",
// "time": "1674057000",
// "short_liq_amount": "0",
// "long_liq_amount": "0",
// "open_interest_usd": "9872386.7775",
// "top_lsr_account": "0",
// "open_interest": "2851725",
// "long_liq_usd": "0",
// "lsr_taker": "9.3765153315902"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var timestamp interface{} = this.SafeTimestamp(interest, "time")
return map[string]interface{} {
"symbol": this.SafeString(market, "symbol"),
"openInterestAmount": this.SafeNumber(interest, "open_interest"),
"openInterestValue": this.SafeNumber(interest, "open_interest_usd"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"info": interest,
}
}
/**
* @method
* @name gate#fetchSettlementHistory
* @description fetches historical settlement records
* @see https://www.gate.io/docs/developers/apiv4/en/#list-settlement-history-2
* @param {string} symbol unified market symbol of the settlement history, required on gate
* @param {int} [since] timestamp in ms
* @param {int} [limit] number of records
* @param {object} [params] exchange specific params
* @returns {object[]} a list of [settlement history objects]{@link https://docs.ccxt.com/#/?id=settlement-history-structure}
*/
func (this *gate) FetchSettlementHistory(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, " fetchSettlementHistory() requires a symbol argument")))
}
retRes69538 := (<-this.LoadMarkets())
PanicOnError(retRes69538)
var market interface{} = this.Market(symbol)
var typeVar interface{} = nil
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchSettlementHistory", market, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
if IsTrue(!IsEqual(typeVar, "option")) {
panic(NotSupported(Add(this.Id, " fetchSettlementHistory() supports option markets only")))
}
var marketId interface{} = GetValue(market, "id")
var optionParts interface{} = Split(marketId, "-")
var request interface{} = map[string]interface{} {
"underlying": this.SafeString(optionParts, 0),
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PublicOptionsGetSettlements(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// "time": 1685952000,
// "profit": "18.266806892718",
// "settle_price": "26826.68068927182",
// "fee": "0.040240021034",
// "contract": "BTC_USDT-20230605-25000-C",
// "strike_price": "25000"
// }
// ]
//
var settlements interface{} = this.ParseSettlements(response, market)
var sorted interface{} = this.SortBy(settlements, "timestamp")
ch <- this.FilterBySymbolSinceLimit(sorted, symbol, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchMySettlementHistory
* @description fetches historical settlement records of the user
* @see https://www.gate.io/docs/developers/apiv4/en/#list-my-options-settlements
* @param {string} symbol unified market symbol of the settlement history
* @param {int} [since] timestamp in ms
* @param {int} [limit] number of records
* @param {object} [params] exchange specific params
* @returns {object[]} a list of [settlement history objects]
*/
func (this *gate) FetchMySettlementHistory(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, " fetchMySettlementHistory() requires a symbol argument")))
}
retRes70048 := (<-this.LoadMarkets())
PanicOnError(retRes70048)
var market interface{} = this.Market(symbol)
var typeVar interface{} = nil
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchMySettlementHistory", market, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
if IsTrue(!IsEqual(typeVar, "option")) {
panic(NotSupported(Add(this.Id, " fetchMySettlementHistory() supports option markets only")))
}
var marketId interface{} = GetValue(market, "id")
var optionParts interface{} = Split(marketId, "-")
var request interface{} = map[string]interface{} {
"underlying": this.SafeString(optionParts, 0),
"contract": marketId,
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
response:= (<-this.PrivateOptionsGetMySettlements(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// "size": -1,
// "settle_profit": "0",
// "contract": "BTC_USDT-20220624-26000-C",
// "strike_price": "26000",
// "time": 1656057600,
// "settle_price": "20917.461281337048",
// "underlying": "BTC_USDT",
// "realised_pnl": "-0.00116042",
// "fee": "0"
// }
// ]
//
var result interface{} = this.SafeValue(response, "result", map[string]interface{} {})
var data interface{} = this.SafeValue(result, "list", []interface{}{})
var settlements interface{} = this.ParseSettlements(data, market)
var sorted interface{} = this.SortBy(settlements, "timestamp")
ch <- this.FilterBySymbolSinceLimit(sorted, GetValue(market, "symbol"), since, limit)
return nil
}()
return ch
}
func (this *gate) ParseSettlement(settlement interface{}, market interface{}) interface{} {
//
// fetchSettlementHistory
//
// {
// "time": 1685952000,
// "profit": "18.266806892718",
// "settle_price": "26826.68068927182",
// "fee": "0.040240021034",
// "contract": "BTC_USDT-20230605-25000-C",
// "strike_price": "25000"
// }
//
// fetchMySettlementHistory
//
// {
// "size": -1,
// "settle_profit": "0",
// "contract": "BTC_USDT-20220624-26000-C",
// "strike_price": "26000",
// "time": 1656057600,
// "settle_price": "20917.461281337048",
// "underlying": "BTC_USDT",
// "realised_pnl": "-0.00116042",
// "fee": "0"
// }
//
var timestamp interface{} = this.SafeTimestamp(settlement, "time")
var marketId interface{} = this.SafeString(settlement, "contract")
return map[string]interface{} {
"info": settlement,
"symbol": this.SafeSymbol(marketId, market),
"price": this.SafeNumber(settlement, "settle_price"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
}
}
func (this *gate) ParseSettlements(settlements interface{}, market interface{}) interface{} {
//
// fetchSettlementHistory
//
// [
// {
// "time": 1685952000,
// "profit": "18.266806892718",
// "settle_price": "26826.68068927182",
// "fee": "0.040240021034",
// "contract": "BTC_USDT-20230605-25000-C",
// "strike_price": "25000"
// }
// ]
//
// fetchMySettlementHistory
//
// [
// {
// "size": -1,
// "settle_profit": "0",
// "contract": "BTC_USDT-20220624-26000-C",
// "strike_price": "26000",
// "time": 1656057600,
// "settle_price": "20917.461281337048",
// "underlying": "BTC_USDT",
// "realised_pnl": "-0.00116042",
// "fee": "0"
// }
// ]
//
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(settlements)); i++ {
AppendToArray(&result,this.ParseSettlement(GetValue(settlements, i), market))
}
return result
}
/**
* @method
* @name gate#fetchLedger
* @description fetch the history of changes, actions done by the user or operations that altered the balance of the user
* @see https://www.gate.io/docs/developers/apiv4/en/#query-account-book
* @see https://www.gate.io/docs/developers/apiv4/en/#list-margin-account-balance-change-history
* @see https://www.gate.io/docs/developers/apiv4/en/#query-account-book-2
* @see https://www.gate.io/docs/developers/apiv4/en/#query-account-book-3
* @see https://www.gate.io/docs/developers/apiv4/en/#list-account-changing-history
* @param {string} [code] unified currency code
* @param {int} [since] timestamp in ms of the earliest ledger entry
* @param {int} [limit] max number of ledger entries to return
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] end time in ms
* @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 *gate) 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
retRes71408 := (<-this.LoadMarkets())
PanicOnError(retRes71408)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchLedger", "paginate");
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes714419 := (<-this.FetchPaginatedCallDynamic("fetchLedger", code, since, limit, params))
PanicOnError(retRes714419)
ch <- retRes714419
return nil
}
var typeVar interface{} = nil
var currency interface{} = nil
var response interface{} = nil
var request interface{} = map[string]interface{} {}
typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchLedger", nil, params);
typeVar = GetValue(typeVarparamsVariable,0);
params = GetValue(typeVarparamsVariable,1)
if IsTrue(IsTrue((IsEqual(typeVar, "spot"))) || IsTrue((IsEqual(typeVar, "margin")))) {
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "currency", GetValue(currency, "id")) // todo: currencies have network-junctions
}
}
if IsTrue(IsTrue((IsEqual(typeVar, "swap"))) || IsTrue((IsEqual(typeVar, "future")))) {
var defaultSettle interface{} = Ternary(IsTrue((IsEqual(typeVar, "swap"))), "usdt", "btc")
var settle interface{} = this.SafeStringLower(params, "settle", defaultSettle)
params = this.Omit(params, "settle")
AddElementToObject(request, "settle", settle)
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
requestparamsVariable := this.HandleUntilOption("to", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(IsEqual(typeVar, "spot")) {
response = (<-this.PrivateSpotGetAccountBook(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "margin")) {
response = (<-this.PrivateMarginGetAccountBook(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "swap")) {
response = (<-this.PrivateFuturesGetSettleAccountBook(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "future")) {
response = (<-this.PrivateDeliveryGetSettleAccountBook(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(typeVar, "option")) {
response = (<-this.PrivateOptionsGetAccountBook(this.Extend(request, params)))
PanicOnError(response)
}
//
// spot
//
// [
// {
// "id": "123456",
// "time": 1547633726123,
// "currency": "BTC",
// "change": "1.03",
// "balance": "4.59316525194",
// "type": "margin_in"
// }
// ]
//
// margin
//
// [
// {
// "id": "123456",
// "time": "1547633726",
// "time_ms": 1547633726123,
// "currency": "BTC",
// "currency_pair": "BTC_USDT",
// "change": "1.03",
// "balance": "4.59316525194"
// }
// ]
//
// swap and future
//
// [
// {
// "time": 1682294400.123456,
// "change": "0.000010152188",
// "balance": "4.59316525194",
// "text": "ETH_USD:6086261",
// "type": "fee"
// }
// ]
//
// option
//
// [
// {
// "time": 1685594770,
// "change": "3.33",
// "balance": "29.87911771",
// "text": "BTC_USDT-20230602-26500-C:2611026125",
// "type": "prem"
// }
// ]
//
ch <- this.ParseLedger(response, currency, since, limit)
return nil
}()
return ch
}
func (this *gate) ParseLedgerEntry(item interface{}, optionalArgs ...interface{}) interface{} {
//
// spot
//
// {
// "id": "123456",
// "time": 1547633726123,
// "currency": "BTC",
// "change": "1.03",
// "balance": "4.59316525194",
// "type": "margin_in"
// }
//
// margin
//
// {
// "id": "123456",
// "time": "1547633726",
// "time_ms": 1547633726123,
// "currency": "BTC",
// "currency_pair": "BTC_USDT",
// "change": "1.03",
// "balance": "4.59316525194"
// }
//
// swap and future
//
// {
// "time": 1682294400.123456,
// "change": "0.000010152188",
// "balance": "4.59316525194",
// "text": "ETH_USD:6086261",
// "type": "fee"
// }
//
// option
//
// {
// "time": 1685594770,
// "change": "3.33",
// "balance": "29.87911771",
// "text": "BTC_USDT-20230602-26500-C:2611026125",
// "type": "prem"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var direction interface{} = nil
var amount interface{} = this.SafeString(item, "change")
if IsTrue(Precise.StringLt(amount, "0")) {
direction = "out"
amount = Precise.StringAbs(amount)
} else {
direction = "in"
}
var currencyId interface{} = this.SafeString(item, "currency")
currency = this.SafeCurrency(currencyId, currency)
var typeVar interface{} = this.SafeString(item, "type")
var rawTimestamp interface{} = this.SafeString(item, "time")
var timestamp interface{} = nil
if IsTrue(IsGreaterThan(GetLength(rawTimestamp), 10)) {
timestamp = ParseInt(rawTimestamp)
} else {
timestamp = Multiply(ParseInt(rawTimestamp), 1000)
}
var balanceString interface{} = this.SafeString(item, "balance")
var changeString interface{} = this.SafeString(item, "change")
var before interface{} = this.ParseNumber(Precise.StringSub(balanceString, changeString))
return this.SafeLedgerEntry(map[string]interface{} {
"info": item,
"id": this.SafeString(item, "id"),
"direction": direction,
"account": nil,
"referenceAccount": nil,
"referenceId": nil,
"type": this.ParseLedgerEntryType(typeVar),
"currency": this.SafeCurrencyCode(currencyId, currency),
"amount": this.ParseNumber(amount),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"before": before,
"after": this.SafeNumber(item, "balance"),
"status": nil,
"fee": nil,
}, currency)
}
func (this *gate) ParseLedgerEntryType(typeVar interface{}) interface{} {
var ledgerType interface{} = map[string]interface{} {
"deposit": "deposit",
"withdraw": "withdrawal",
"sub_account_transfer": "transfer",
"margin_in": "transfer",
"margin_out": "transfer",
"margin_funding_in": "transfer",
"margin_funding_out": "transfer",
"cross_margin_in": "transfer",
"cross_margin_out": "transfer",
"copy_trading_in": "transfer",
"copy_trading_out": "transfer",
"quant_in": "transfer",
"quant_out": "transfer",
"futures_in": "transfer",
"futures_out": "transfer",
"delivery_in": "transfer",
"delivery_out": "transfer",
"new_order": "trade",
"order_fill": "trade",
"referral_fee": "rebate",
"order_fee": "fee",
"interest": "interest",
"lend": "loan",
"redeem": "loan",
"profit": "interest",
"flash_swap_buy": "trade",
"flash_swap_sell": "trade",
"unknown": "unknown",
"set": "settlement",
"prem": "trade",
"point_refr": "rebate",
"point_fee": "fee",
"point_dnw": "deposit/withdraw",
"fund": "fee",
"refr": "rebate",
"fee": "fee",
"pnl": "trade",
"dnw": "deposit/withdraw",
}
return this.SafeString(ledgerType, typeVar, typeVar)
}
/**
* @method
* @name gate#setPositionMode
* @description set dual/hedged mode to true or false for a swap market, make sure all positions are closed and no orders are open before setting dual mode
* @see https://www.gate.io/docs/developers/apiv4/en/#enable-or-disable-dual-mode
* @param {bool} hedged set to true to enable dual mode
* @param {string|undefined} symbol if passed, dual mode is set for all markets with the same settle currency
* @param {object} params extra parameters specific to the exchange API endpoint
* @param {string} params.settle settle currency
* @returns {object} response from the exchange
*/
func (this *gate) 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
var market interface{} = Ternary(IsTrue((!IsEqual(symbol, nil))), this.Market(symbol), nil)
requestqueryVariable := this.PrepareRequest(market, "swap", params);
request := GetValue(requestqueryVariable,0);
query := GetValue(requestqueryVariable,1)
AddElementToObject(request, "dual_mode", hedged)
retRes738015 := (<-this.PrivateFuturesPostSettleDualMode(this.Extend(request, query)))
PanicOnError(retRes738015)
ch <- retRes738015
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchUnderlyingAssets
* @description fetches the market ids of underlying assets for a specific contract market type
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-underlyings
* @param {object} [params] exchange specific params
* @param {string} [params.type] the contract market type, 'option', 'swap' or 'future', the default is 'option'
* @returns {object[]} a list of [underlying assets]{@link https://docs.ccxt.com/#/?id=underlying-assets-structure}
*/
func (this *gate) FetchUnderlyingAssets(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
retRes73938 := (<-this.LoadMarkets())
PanicOnError(retRes73938)
var marketType interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchUnderlyingAssets", nil, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
if IsTrue(IsTrue((IsEqual(marketType, nil))) || IsTrue((IsEqual(marketType, "spot")))) {
marketType = "option"
}
if IsTrue(!IsEqual(marketType, "option")) {
panic(NotSupported(Add(this.Id, " fetchUnderlyingAssets() supports option markets only")))
}
response:= (<-this.PublicOptionsGetUnderlyings(params))
PanicOnError(response)
//
// [
// {
// "index_time": "1646915796",
// "name": "BTC_USDT",
// "index_price": "39142.73"
// }
// ]
//
var underlyings interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var underlying interface{} = GetValue(response, i)
var name interface{} = this.SafeString(underlying, "name")
if IsTrue(!IsEqual(name, nil)) {
AppendToArray(&underlyings,name)
}
}
ch <- underlyings
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchLiquidations
* @description retrieves the public liquidations of a trading pair
* @see https://www.gate.io/docs/developers/apiv4/en/#retrieve-liquidation-history
* @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 exchange API endpoint
* @param {int} [params.until] timestamp in ms of the latest liquidation
* @returns {object} an array of [liquidation structures]{@link https://docs.ccxt.com/#/?id=liquidation-structure}
*/
func (this *gate) FetchLiquidations(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
retRes74368 := (<-this.LoadMarkets())
PanicOnError(retRes74368)
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "swap")) {
panic(NotSupported(Add(this.Id, " fetchLiquidations() supports swap markets only")))
}
var request interface{} = map[string]interface{} {
"settle": GetValue(market, "settleId"),
"contract": GetValue(market, "id"),
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
requestparamsVariable := this.HandleUntilOption("to", request, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
response:= (<-this.PublicFuturesGetSettleLiqOrders(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// "contract": "BTC_USDT",
// "left": 0,
// "size": -165,
// "fill_price": "28070",
// "order_price": "28225",
// "time": 1696736132
// },
// ]
//
ch <- this.ParseLiquidations(response, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchMyLiquidations
* @description retrieves the users liquidated positions
* @see https://www.gate.io/docs/developers/apiv4/en/#list-liquidation-history
* @see https://www.gate.io/docs/developers/apiv4/en/#list-liquidation-history-2
* @see https://www.gate.io/docs/developers/apiv4/en/#list-user-s-liquidation-history-of-specified-underlying
* @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 exchange API endpoint
* @returns {object} an array of [liquidation structures]{@link https://docs.ccxt.com/#/?id=liquidation-structure}
*/
func (this *gate) 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
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchMyLiquidations() requires a symbol argument")))
}
retRes74858 := (<-this.LoadMarkets())
PanicOnError(retRes74858)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"contract": GetValue(market, "id"),
}
var response interface{} = nil
if IsTrue(IsTrue((GetValue(market, "swap"))) || IsTrue((GetValue(market, "future")))) {
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
AddElementToObject(request, "settle", GetValue(market, "settleId"))
} else if IsTrue(GetValue(market, "option")) {
var marketId interface{} = GetValue(market, "id")
var optionParts interface{} = Split(marketId, "-")
AddElementToObject(request, "underlying", this.SafeString(optionParts, 0))
}
if IsTrue(GetValue(market, "swap")) {
response = (<-this.PrivateFuturesGetSettleLiquidates(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "future")) {
response = (<-this.PrivateDeliveryGetSettleLiquidates(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(GetValue(market, "option")) {
response = (<-this.PrivateOptionsGetPositionClose(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(NotSupported(Add(Add(Add(this.Id, " fetchMyLiquidations() does not support "), GetValue(market, "type")), " orders")))
}
//
// swap and future
//
// [
// {
// "time": 1548654951,
// "contract": "BTC_USDT",
// "size": 600,
// "leverage": "25",
// "margin": "0.006705256878",
// "entry_price": "3536.123",
// "liq_price": "3421.54",
// "mark_price": "3420.27",
// "order_id": 317393847,
// "order_price": "3405",
// "fill_price": "3424",
// "left": 0
// }
// ]
//
// option
//
// [
// {
// "time": 1631764800,
// "pnl": "-42914.291",
// "settle_size": "-10001",
// "side": "short",
// "contract": "BTC_USDT-20210916-5000-C",
// "text": "settled"
// }
// ]
//
ch <- this.ParseLiquidations(response, market, since, limit)
return nil
}()
return ch
}
func (this *gate) ParseLiquidation(liquidation interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchLiquidations
//
// {
// "contract": "BTC_USDT",
// "left": 0,
// "size": -165,
// "fill_price": "28070",
// "order_price": "28225",
// "time": 1696736132
// }
//
// swap and future: fetchMyLiquidations
//
// {
// "time": 1548654951,
// "contract": "BTC_USDT",
// "size": 600,
// "leverage": "25",
// "margin": "0.006705256878",
// "entry_price": "3536.123",
// "liq_price": "3421.54",
// "mark_price": "3420.27",
// "order_id": 317393847,
// "order_price": "3405",
// "fill_price": "3424",
// "left": 0
// }
//
// option: fetchMyLiquidations
//
// {
// "time": 1631764800,
// "pnl": "-42914.291",
// "settle_size": "-10001",
// "side": "short",
// "contract": "BTC_USDT-20210916-5000-C",
// "text": "settled"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(liquidation, "contract")
var timestamp interface{} = this.SafeTimestamp(liquidation, "time")
var size interface{} = this.SafeString2(liquidation, "size", "settle_size")
var left interface{} = this.SafeString(liquidation, "left", "0")
var contractsString interface{} = Precise.StringAbs(Precise.StringSub(size, left))
var contractSizeString interface{} = this.SafeString(market, "contractSize")
var priceString interface{} = this.SafeString2(liquidation, "liq_price", "fill_price")
var baseValueString interface{} = Precise.StringMul(contractsString, contractSizeString)
var quoteValueString interface{} = this.SafeString(liquidation, "pnl")
if IsTrue(IsEqual(quoteValueString, nil)) {
quoteValueString = Precise.StringMul(baseValueString, priceString)
}
return this.SafeLiquidation(map[string]interface{} {
"info": liquidation,
"symbol": this.SafeSymbol(marketId, market),
"contracts": this.ParseNumber(contractsString),
"contractSize": this.ParseNumber(contractSizeString),
"price": this.ParseNumber(priceString),
"baseValue": this.ParseNumber(baseValueString),
"quoteValue": this.ParseNumber(Precise.StringAbs(quoteValueString)),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
})
}
/**
* @method
* @name gate#fetchGreeks
* @description fetches an option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract
* @see https://www.gate.io/docs/developers/apiv4/en/#list-tickers-of-options-contracts
* @param {string} symbol unified symbol of the market to fetch greeks for
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [greeks structure]{@link https://docs.ccxt.com/#/?id=greeks-structure}
*/
func (this *gate) FetchGreeks(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
retRes76228 := (<-this.LoadMarkets())
PanicOnError(retRes76228)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"underlying": GetValue(GetValue(market, "info"), "underlying"),
}
response:= (<-this.PublicOptionsGetTickers(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// "vega": "1.78992",
// "leverage": "6.2096777055417",
// "ask_iv": "0.6245",
// "delta": "-0.69397",
// "last_price": "0",
// "theta": "-2.5723",
// "bid1_price": "222.9",
// "mark_iv": "0.5909",
// "name": "ETH_USDT-20231201-2300-P",
// "bid_iv": "0.5065",
// "ask1_price": "243.6",
// "mark_price": "236.57",
// "position_size": 0,
// "bid1_size": 368,
// "ask1_size": -335,
// "gamma": "0.00116"
// },
// ]
//
var marketId interface{} = GetValue(market, "id")
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var entry interface{} = GetValue(response, i)
var entryMarketId interface{} = this.SafeString(entry, "name")
if IsTrue(IsEqual(entryMarketId, marketId)) {
ch <- this.ParseGreeks(entry, market)
return nil
}
}
return nil
}()
return ch
}
func (this *gate) ParseGreeks(greeks interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "vega": "1.78992",
// "leverage": "6.2096777055417",
// "ask_iv": "0.6245",
// "delta": "-0.69397",
// "last_price": "0",
// "theta": "-2.5723",
// "bid1_price": "222.9",
// "mark_iv": "0.5909",
// "name": "ETH_USDT-20231201-2300-P",
// "bid_iv": "0.5065",
// "ask1_price": "243.6",
// "mark_price": "236.57",
// "position_size": 0,
// "bid1_size": 368,
// "ask1_size": -335,
// "gamma": "0.00116"
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(greeks, "name")
var symbol interface{} = this.SafeSymbol(marketId, market)
return map[string]interface{} {
"symbol": symbol,
"timestamp": nil,
"datetime": nil,
"delta": this.SafeNumber(greeks, "delta"),
"gamma": this.SafeNumber(greeks, "gamma"),
"theta": this.SafeNumber(greeks, "theta"),
"vega": this.SafeNumber(greeks, "vega"),
"rho": nil,
"bidSize": this.SafeNumber(greeks, "bid1_size"),
"askSize": this.SafeNumber(greeks, "ask1_size"),
"bidImpliedVolatility": this.SafeNumber(greeks, "bid_iv"),
"askImpliedVolatility": this.SafeNumber(greeks, "ask_iv"),
"markImpliedVolatility": this.SafeNumber(greeks, "mark_iv"),
"bidPrice": this.SafeNumber(greeks, "bid1_price"),
"askPrice": this.SafeNumber(greeks, "ask1_price"),
"markPrice": this.SafeNumber(greeks, "mark_price"),
"lastPrice": this.SafeNumber(greeks, "last_price"),
"underlyingPrice": this.ParseNumber(GetValue(GetValue(market, "info"), "underlying_price")),
"info": greeks,
}
}
/**
* @method
* @name gate#closePosition
* @description closes open positions for a market
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-futures-order
* @see https://www.gate.io/docs/developers/apiv4/en/#create-a-futures-order-2
* @see https://www.gate.io/docs/developers/apiv4/en/#create-an-options-order
* @param {string} symbol Unified CCXT market symbol
* @param {string} side 'buy' or 'sell'
* @param {object} [params] extra parameters specific to the okx api endpoint
* @returns {object[]} [A list of position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *gate) 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
var request interface{} = map[string]interface{} {
"close": true,
}
params = this.Extend(request, params)
if IsTrue(IsEqual(side, nil)) {
side = "" // side is not used but needs to be present, otherwise crashes in php
}
retRes772715 := (<-this.CreateOrder(symbol, "market", side, 0, nil, params))
PanicOnError(retRes772715)
ch <- retRes772715
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchLeverage
* @description fetch the set leverage for a market
* @see https://www.gate.io/docs/developers/apiv4/en/#get-unified-account-information
* @see https://www.gate.io/docs/developers/apiv4/en/#get-detail-of-lending-market
* @see https://www.gate.io/docs/developers/apiv4/en/#query-one-single-margin-currency-pair-deprecated
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {boolean} [params.unified] default false, set to true for fetching the unified accounts leverage
* @returns {object} a [leverage structure]{@link https://docs.ccxt.com/#/?id=leverage-structure}
*/
func (this *gate) 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
retRes77438 := (<-this.LoadMarkets())
PanicOnError(retRes77438)
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
// unified account does not require a symbol
market = this.Market(symbol)
}
var request interface{} = map[string]interface{} {}
var response interface{} = nil
var isUnified interface{} = this.SafeBool(params, "unified")
params = this.Omit(params, "unified")
if IsTrue(GetValue(market, "spot")) {
AddElementToObject(request, "currency_pair", GetValue(market, "id"))
if IsTrue(isUnified) {
response = (<-this.PublicMarginGetUniCurrencyPairsCurrencyPair(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.PublicMarginGetCurrencyPairsCurrencyPair(this.Extend(request, params)))
PanicOnError(response)
}
} else if IsTrue(isUnified) {
response = (<-this.PrivateUnifiedGetAccounts(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(NotSupported(Add(Add(Add(this.Id, " fetchLeverage() does not support "), GetValue(market, "type")), " markets")))
}
ch <- this.ParseLeverage(response, market)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchLeverages
* @description fetch the set leverage for all leverage markets, only spot margin is supported on gate
* @see https://www.gate.io/docs/developers/apiv4/en/#list-lending-markets
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-supported-currency-pairs-supported-in-margin-trading-deprecated
* @param {string[]} symbols a list of unified market symbols
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {boolean} [params.unified] default false, set to true for fetching unified account leverages
* @returns {object} a list of [leverage structures]{@link https://docs.ccxt.com/#/?id=leverage-structure}
*/
func (this *gate) FetchLeverages(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
retRes78508 := (<-this.LoadMarkets())
PanicOnError(retRes78508)
symbols = this.MarketSymbols(symbols)
var response interface{} = nil
var isUnified interface{} = this.SafeBool(params, "unified")
params = this.Omit(params, "unified")
var marketIdRequest interface{} = "id"
if IsTrue(isUnified) {
marketIdRequest = "currency_pair"
response = (<-this.PublicMarginGetUniCurrencyPairs(params))
PanicOnError(response)
} else {
response = (<-this.PublicMarginGetCurrencyPairs(params))
PanicOnError(response)
}
ch <- this.ParseLeverages(response, symbols, marketIdRequest, "spot")
return nil
}()
return ch
}
func (this *gate) ParseLeverage(leverage interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString2(leverage, "currency_pair", "id")
var leverageValue interface{} = this.SafeInteger(leverage, "leverage")
return map[string]interface{} {
"info": leverage,
"symbol": this.SafeSymbol(marketId, market, "_", "spot"),
"marginMode": nil,
"longLeverage": leverageValue,
"shortLeverage": leverageValue,
}
}
/**
* @method
* @name gate#fetchOption
* @description fetches option data that is commonly found in an option chain
* @see https://www.gate.io/docs/developers/apiv4/en/#query-specified-contract-detail
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an [option chain structure]{@link https://docs.ccxt.com/#/?id=option-chain-structure}
*/
func (this *gate) FetchOption(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
retRes79118 := (<-this.LoadMarkets())
PanicOnError(retRes79118)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"contract": GetValue(market, "id"),
}
response:= (<-this.PublicOptionsGetContractsContract(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "is_active": true,
// "mark_price_round": "0.01",
// "settle_fee_rate": "0.00015",
// "bid1_size": 30,
// "taker_fee_rate": "0.0003",
// "price_limit_fee_rate": "0.1",
// "order_price_round": "0.1",
// "tag": "month",
// "ref_rebate_rate": "0",
// "name": "ETH_USDT-20240628-4500-C",
// "strike_price": "4500",
// "ask1_price": "280.5",
// "ref_discount_rate": "0",
// "order_price_deviate": "0.2",
// "ask1_size": -19,
// "mark_price_down": "155.45",
// "orderbook_id": 11724695,
// "is_call": true,
// "last_price": "188.7",
// "mark_price": "274.26",
// "underlying": "ETH_USDT",
// "create_time": 1688024882,
// "settle_limit_fee_rate": "0.1",
// "orders_limit": 10,
// "mark_price_up": "403.83",
// "position_size": 80,
// "order_size_max": 10000,
// "position_limit": 100000,
// "multiplier": "0.01",
// "order_size_min": 1,
// "trade_size": 229,
// "underlying_price": "3326.6",
// "maker_fee_rate": "0.0003",
// "expiration_time": 1719561600,
// "trade_id": 15,
// "bid1_price": "269.3"
// }
//
ch <- this.ParseOption(response, nil, market)
return nil
}()
return ch
}
/**
* @method
* @name gate#fetchOptionChain
* @description fetches data for an underlying asset that is commonly found in an option chain
* @see https://www.gate.io/docs/developers/apiv4/en/#list-all-the-contracts-with-specified-underlying-and-expiration-time
* @param {string} code base currency to fetch an option chain for
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.underlying] the underlying asset, can be obtained from fetchUnderlyingAssets ()
* @param {int} [params.expiration] unix timestamp of the expiration time
* @returns {object} a list of [option chain structures]{@link https://docs.ccxt.com/#/?id=option-chain-structure}
*/
func (this *gate) FetchOptionChain(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
retRes79728 := (<-this.LoadMarkets())
PanicOnError(retRes79728)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"underlying": Add(GetValue(currency, "code"), "_USDT"),
}
response:= (<-this.PublicOptionsGetContracts(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// "is_active": true,
// "mark_price_round": "0.1",
// "settle_fee_rate": "0.00015",
// "bid1_size": 434,
// "taker_fee_rate": "0.0003",
// "price_limit_fee_rate": "0.1",
// "order_price_round": "1",
// "tag": "day",
// "ref_rebate_rate": "0",
// "name": "BTC_USDT-20240324-63500-P",
// "strike_price": "63500",
// "ask1_price": "387",
// "ref_discount_rate": "0",
// "order_price_deviate": "0.15",
// "ask1_size": -454,
// "mark_price_down": "124.3",
// "orderbook_id": 29600,
// "is_call": false,
// "last_price": "0",
// "mark_price": "366.6",
// "underlying": "BTC_USDT",
// "create_time": 1711118829,
// "settle_limit_fee_rate": "0.1",
// "orders_limit": 10,
// "mark_price_up": "630",
// "position_size": 0,
// "order_size_max": 10000,
// "position_limit": 10000,
// "multiplier": "0.01",
// "order_size_min": 1,
// "trade_size": 0,
// "underlying_price": "64084.65",
// "maker_fee_rate": "0.0003",
// "expiration_time": 1711267200,
// "trade_id": 0,
// "bid1_price": "307"
// },
// ]
//
ch <- this.ParseOptionChain(response, nil, "name")
return nil
}()
return ch
}
func (this *gate) ParseOption(chain interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "is_active": true,
// "mark_price_round": "0.1",
// "settle_fee_rate": "0.00015",
// "bid1_size": 434,
// "taker_fee_rate": "0.0003",
// "price_limit_fee_rate": "0.1",
// "order_price_round": "1",
// "tag": "day",
// "ref_rebate_rate": "0",
// "name": "BTC_USDT-20240324-63500-P",
// "strike_price": "63500",
// "ask1_price": "387",
// "ref_discount_rate": "0",
// "order_price_deviate": "0.15",
// "ask1_size": -454,
// "mark_price_down": "124.3",
// "orderbook_id": 29600,
// "is_call": false,
// "last_price": "0",
// "mark_price": "366.6",
// "underlying": "BTC_USDT",
// "create_time": 1711118829,
// "settle_limit_fee_rate": "0.1",
// "orders_limit": 10,
// "mark_price_up": "630",
// "position_size": 0,
// "order_size_max": 10000,
// "position_limit": 10000,
// "multiplier": "0.01",
// "order_size_min": 1,
// "trade_size": 0,
// "underlying_price": "64084.65",
// "maker_fee_rate": "0.0003",
// "expiration_time": 1711267200,
// "trade_id": 0,
// "bid1_price": "307"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
market := GetArg(optionalArgs, 1, nil)
_ = market
var marketId interface{} = this.SafeString(chain, "name")
market = this.SafeMarket(marketId, market)
var timestamp interface{} = this.SafeTimestamp(chain, "create_time")
return map[string]interface{} {
"info": chain,
"currency": nil,
"symbol": GetValue(market, "symbol"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"impliedVolatility": nil,
"openInterest": nil,
"bidPrice": this.SafeNumber(chain, "bid1_price"),
"askPrice": this.SafeNumber(chain, "ask1_price"),
"midPrice": nil,
"markPrice": this.SafeNumber(chain, "mark_price"),
"lastPrice": this.SafeNumber(chain, "last_price"),
"underlyingPrice": this.SafeNumber(chain, "underlying_price"),
"change": nil,
"percentage": nil,
"baseVolume": nil,
"quoteVolume": nil,
}
}
/**
* @method
* @name gate#fetchPositionsHistory
* @description fetches historical positions
* @see https://www.gate.io/docs/developers/apiv4/#list-position-close-history
* @see https://www.gate.io/docs/developers/apiv4/#list-position-close-history-2
* @param {string[]} symbols unified conract symbols, must all have the same settle currency and the same market type
* @param {int} [since] the earliest time in ms to fetch positions for
* @param {int} [limit] the maximum amount of records to fetch, default=1000
* @param {object} params extra parameters specific to the exchange api endpoint
* @param {int} [params.until] the latest time in ms to fetch positions for
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {int} [params.offset] list offset, starting from 0
* @param {string} [params.side] long or short
* @param {string} [params.pnl] query profit or loss
* @returns {object[]} a list of [position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *gate) 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
retRes81078 := (<-this.LoadMarkets())
PanicOnError(retRes81078)
var market interface{} = nil
if IsTrue(!IsEqual(symbols, nil)) {
var symbolsLength interface{} = GetArrayLength(symbols)
if IsTrue(IsEqual(symbolsLength, 1)) {
market = this.Market(GetValue(symbols, 0))
}
}
var marketType interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchPositionsHistory", market, params, "swap");
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
var until interface{} = this.SafeInteger(params, "until")
params = this.Omit(params, "until")
var request interface{} = map[string]interface{} {}
requestparamsVariable := this.PrepareRequest(market, marketType, params);
request = GetValue(requestparamsVariable,0);
params = GetValue(requestparamsVariable,1)
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
}
if IsTrue(!IsEqual(until, nil)) {
AddElementToObject(request, "to", this.ParseToInt(Divide(until, 1000)))
}
var response interface{} = nil
if IsTrue(IsEqual(marketType, "swap")) {
response = (<-this.PrivateFuturesGetSettlePositionClose(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marketType, "future")) {
response = (<-this.PrivateDeliveryGetSettlePositionClose(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(NotSupported(Add(Add(this.Id, " fetchPositionsHistory() does not support markets of type "), marketType)))
}
//
// [
// {
// "contract": "SLERF_USDT",
// "text": "web",
// "long_price": "0.766306",
// "pnl": "-23.41702352",
// "pnl_pnl": "-22.7187",
// "pnl_fee": "-0.06527125",
// "pnl_fund": "-0.63305227",
// "accum_size": "100",
// "time": 1711279263,
// "short_price": "0.539119",
// "side": "long",
// "max_size": "100",
// "first_open_time": 1711037985
// },
// ...
// ]
//
ch <- this.ParsePositions(response, symbols, params)
return nil
}()
return ch
}
func (this *gate) HandleErrors(code interface{}, reason interface{}, url interface{}, method interface{}, headers interface{}, body interface{}, response interface{}, requestHeaders interface{}, requestBody interface{}) interface{} {
if IsTrue(IsEqual(response, nil)) {
return nil
}
//
// {"label": "ORDER_NOT_FOUND", "message": "Order not found"}
// {"label": "INVALID_PARAM_VALUE", "message": "invalid argument: status"}
// {"label": "INVALID_PARAM_VALUE", "message": "invalid argument: Trigger.rule"}
// {"label": "INVALID_PARAM_VALUE", "message": "invalid argument: trigger.expiration invalid range"}
// {"label": "INVALID_ARGUMENT", "detail": "invalid size"}
// {"user_id":10406147,"id":"id","succeeded":false,"message":"INVALID_PROTOCOL","label":"INVALID_PROTOCOL"}
//
var label interface{} = this.SafeString(response, "label")
if IsTrue(!IsEqual(label, nil)) {
var feedback interface{} = Add(Add(this.Id, " "), body)
this.ThrowExactlyMatchedException(GetValue(this.Exceptions, "exact"), label, feedback)
panic(ExchangeError(feedback))
}
return nil
}
func (this *gate) Init(userConfig map[string]interface{}) {
this.Exchange = Exchange{}
this.Exchange.InitParent(userConfig, this.Describe().(map[string]interface{}), this)
this.Exchange.DerivedExchange = this
}