ccxt-go/mexc.go

6772 lines
297 KiB
Go
Raw Normal View History

2025-02-28 10:33:20 +08:00
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 mexc struct {
Exchange
}
func NewMexcCore() mexc {
p := mexc{}
setDefaults(&p)
return p
}
func (this *mexc) Describe() interface{} {
return this.DeepExtend(this.Exchange.Describe(), map[string]interface{} {
"id": "mexc",
"name": "MEXC Global",
"countries": []interface{}{"SC"},
"rateLimit": 50,
"version": "v3",
"certified": true,
"pro": true,
"has": map[string]interface{} {
"CORS": nil,
"spot": true,
"margin": true,
"swap": true,
"future": false,
"option": false,
"addMargin": true,
"borrowCrossMargin": false,
"borrowIsolatedMargin": false,
"borrowMargin": false,
"cancelAllOrders": true,
"cancelOrder": true,
"cancelOrders": nil,
"closeAllPositions": false,
"closePosition": false,
"createDepositAddress": true,
"createMarketBuyOrderWithCost": true,
"createMarketOrderWithCost": true,
"createMarketSellOrderWithCost": true,
"createOrder": true,
"createOrders": true,
"createPostOnlyOrder": true,
"createReduceOnlyOrder": true,
"createStopLimitOrder": true,
"createStopMarketOrder": true,
"createStopOrder": true,
"createTriggerOrder": true,
"deposit": nil,
"editOrder": nil,
"fetchAccounts": true,
"fetchBalance": true,
"fetchBidsAsks": true,
"fetchBorrowInterest": false,
"fetchBorrowRate": false,
"fetchBorrowRateHistories": false,
"fetchBorrowRateHistory": false,
"fetchBorrowRates": false,
"fetchBorrowRatesPerSymbol": false,
"fetchCanceledOrders": true,
"fetchClosedOrder": nil,
"fetchClosedOrders": true,
"fetchCrossBorrowRate": false,
"fetchCrossBorrowRates": false,
"fetchCurrencies": true,
"fetchDeposit": nil,
"fetchDepositAddress": true,
"fetchDepositAddresses": nil,
"fetchDepositAddressesByNetwork": true,
"fetchDeposits": true,
"fetchDepositWithdrawFee": "emulated",
"fetchDepositWithdrawFees": true,
"fetchFundingHistory": true,
"fetchFundingInterval": true,
"fetchFundingIntervals": false,
"fetchFundingRate": true,
"fetchFundingRateHistory": true,
"fetchFundingRates": false,
"fetchIndexOHLCV": true,
"fetchIsolatedBorrowRate": false,
"fetchIsolatedBorrowRates": false,
"fetchIsolatedPositions": false,
"fetchL2OrderBook": true,
"fetchLedger": nil,
"fetchLedgerEntry": nil,
"fetchLeverage": true,
"fetchLeverages": false,
"fetchLeverageTiers": true,
"fetchMarginAdjustmentHistory": false,
"fetchMarginMode": false,
"fetchMarketLeverageTiers": "emulated",
"fetchMarkets": true,
"fetchMarkOHLCV": true,
"fetchMyTrades": true,
"fetchOHLCV": true,
"fetchOpenInterest": false,
"fetchOpenInterestHistory": false,
"fetchOpenOrder": nil,
"fetchOpenOrders": true,
"fetchOrder": true,
"fetchOrderBook": true,
"fetchOrderBooks": nil,
"fetchOrders": true,
"fetchOrderTrades": true,
"fetchPosition": "emulated",
"fetchPositionHistory": "emulated",
"fetchPositionMode": true,
"fetchPositions": true,
"fetchPositionsHistory": true,
"fetchPositionsRisk": nil,
"fetchPremiumIndexOHLCV": false,
"fetchStatus": true,
"fetchTicker": true,
"fetchTickers": true,
"fetchTime": true,
"fetchTrades": true,
"fetchTradingFee": true,
"fetchTradingFees": false,
"fetchTradingLimits": nil,
"fetchTransactionFee": "emulated",
"fetchTransactionFees": true,
"fetchTransactions": nil,
"fetchTransfer": true,
"fetchTransfers": true,
"fetchWithdrawal": nil,
"fetchWithdrawals": true,
"reduceMargin": true,
"repayCrossMargin": false,
"repayIsolatedMargin": false,
"setLeverage": true,
"setMarginMode": true,
"setPositionMode": true,
"signIn": nil,
"transfer": nil,
"withdraw": true,
},
"urls": map[string]interface{} {
"logo": "https://user-images.githubusercontent.com/1294454/137283979-8b2a818d-8633-461b-bfca-de89e8c446b2.jpg",
"api": map[string]interface{} {
"spot": map[string]interface{} {
"public": "https://api.mexc.com",
"private": "https://api.mexc.com",
},
"spot2": map[string]interface{} {
"public": "https://www.mexc.com/open/api/v2",
"private": "https://www.mexc.com/open/api/v2",
},
"contract": map[string]interface{} {
"public": "https://contract.mexc.com/api/v1/contract",
"private": "https://contract.mexc.com/api/v1/private",
},
"broker": map[string]interface{} {
"private": "https://api.mexc.com/api/v3/broker",
},
},
"www": "https://www.mexc.com/",
"doc": []interface{}{"https://mexcdevelop.github.io/apidocs/"},
"fees": []interface{}{"https://www.mexc.com/fee"},
"referral": "https://www.mexc.com/register?inviteCode=mexc-1FQ1GNu1",
},
"api": map[string]interface{} {
"spot": map[string]interface{} {
"public": map[string]interface{} {
"get": map[string]interface{} {
"ping": 1,
"time": 1,
"exchangeInfo": 10,
"depth": 1,
"trades": 5,
"historicalTrades": 1,
"aggTrades": 1,
"klines": 1,
"avgPrice": 1,
"ticker/24hr": 1,
"ticker/price": 1,
"ticker/bookTicker": 1,
"etf/info": 1,
},
},
"private": map[string]interface{} {
"get": map[string]interface{} {
"order": 2,
"openOrders": 3,
"allOrders": 10,
"account": 10,
"myTrades": 10,
"tradeFee": 10,
"sub-account/list": 1,
"sub-account/apiKey": 1,
"capital/config/getall": 10,
"capital/deposit/hisrec": 1,
"capital/withdraw/history": 1,
"capital/withdraw/address": 10,
"capital/deposit/address": 10,
"capital/transfer": 1,
"capital/transfer/tranId": 1,
"capital/transfer/internal": 1,
"capital/sub-account/universalTransfer": 1,
"capital/convert": 1,
"capital/convert/list": 1,
"margin/loan": 1,
"margin/allOrders": 1,
"margin/myTrades": 1,
"margin/openOrders": 1,
"margin/maxTransferable": 1,
"margin/priceIndex": 1,
"margin/order": 1,
"margin/isolated/account": 1,
"margin/maxBorrowable": 1,
"margin/repay": 1,
"margin/isolated/pair": 1,
"margin/forceLiquidationRec": 1,
"margin/isolatedMarginData": 1,
"margin/isolatedMarginTier": 1,
"rebate/taxQuery": 1,
"rebate/detail": 1,
"rebate/detail/kickback": 1,
"rebate/referCode": 1,
"rebate/affiliate/commission": 1,
"rebate/affiliate/withdraw": 1,
"rebate/affiliate/commission/detail": 1,
"mxDeduct/enable": 1,
"userDataStream": 1,
"selfSymbols": 1,
},
"post": map[string]interface{} {
"order": 1,
"order/test": 1,
"sub-account/virtualSubAccount": 1,
"sub-account/apiKey": 1,
"sub-account/futures": 1,
"sub-account/margin": 1,
"batchOrders": 10,
"capital/withdraw/apply": 1,
"capital/withdraw": 1,
"capital/transfer": 1,
"capital/transfer/internal": 1,
"capital/deposit/address": 1,
"capital/sub-account/universalTransfer": 1,
"capital/convert": 10,
"mxDeduct/enable": 1,
"userDataStream": 1,
},
"put": map[string]interface{} {
"userDataStream": 1,
},
"delete": map[string]interface{} {
"order": 1,
"openOrders": 1,
"sub-account/apiKey": 1,
"margin/order": 1,
"margin/openOrders": 1,
"userDataStream": 1,
"capital/withdraw": 1,
},
},
},
"contract": map[string]interface{} {
"public": map[string]interface{} {
"get": map[string]interface{} {
"ping": 2,
"detail": 100,
"support_currencies": 2,
"depth/{symbol}": 2,
"depth_commits/{symbol}/{limit}": 2,
"index_price/{symbol}": 2,
"fair_price/{symbol}": 2,
"funding_rate/{symbol}": 2,
"kline/{symbol}": 2,
"kline/index_price/{symbol}": 2,
"kline/fair_price/{symbol}": 2,
"deals/{symbol}": 2,
"ticker": 2,
"risk_reverse": 2,
"risk_reverse/history": 2,
"funding_rate/history": 2,
},
},
"private": map[string]interface{} {
"get": map[string]interface{} {
"account/assets": 2,
"account/asset/{currency}": 2,
"account/transfer_record": 2,
"position/list/history_positions": 2,
"position/open_positions": 2,
"position/funding_records": 2,
"position/position_mode": 2,
"order/list/open_orders/{symbol}": 2,
"order/list/history_orders": 2,
"order/external/{symbol}/{external_oid}": 2,
"order/get/{order_id}": 2,
"order/batch_query": 8,
"order/deal_details/{order_id}": 2,
"order/list/order_deals": 2,
"planorder/list/orders": 2,
"stoporder/list/orders": 2,
"stoporder/order_details/{stop_order_id}": 2,
"account/risk_limit": 2,
"account/tiered_fee_rate": 2,
"position/leverage": 2,
},
"post": map[string]interface{} {
"position/change_margin": 2,
"position/change_leverage": 2,
"position/change_position_mode": 2,
"order/submit": 2,
"order/submit_batch": 40,
"order/cancel": 2,
"order/cancel_with_external": 2,
"order/cancel_all": 2,
"account/change_risk_level": 2,
"planorder/place": 2,
"planorder/cancel": 2,
"planorder/cancel_all": 2,
"stoporder/cancel": 2,
"stoporder/cancel_all": 2,
"stoporder/change_price": 2,
"stoporder/change_plan_price": 2,
},
},
},
"spot2": map[string]interface{} {
"public": map[string]interface{} {
"get": map[string]interface{} {
"market/symbols": 1,
"market/coin/list": 2,
"common/timestamp": 1,
"common/ping": 2,
"market/ticker": 1,
"market/depth": 1,
"market/deals": 1,
"market/kline": 1,
"market/api_default_symbols": 2,
},
},
"private": map[string]interface{} {
"get": map[string]interface{} {
"account/info": 1,
"order/open_orders": 1,
"order/list": 1,
"order/query": 1,
"order/deals": 1,
"order/deal_detail": 1,
"asset/deposit/address/list": 2,
"asset/deposit/list": 2,
"asset/address/list": 2,
"asset/withdraw/list": 2,
"asset/internal/transfer/record": 10,
"account/balance": 10,
"asset/internal/transfer/info": 10,
"market/api_symbols": 2,
},
"post": map[string]interface{} {
"order/place": 1,
"order/place_batch": 1,
"order/advanced/place_batch": 1,
"asset/withdraw": 2,
"asset/internal/transfer": 10,
},
"delete": map[string]interface{} {
"order/cancel": 1,
"order/cancel_by_symbol": 1,
"asset/withdraw": 2,
},
},
},
"broker": map[string]interface{} {
"private": map[string]interface{} {
"get": map[string]interface{} {
"sub-account/universalTransfer": 1,
"sub-account/list": 1,
"sub-account/apiKey": 1,
"capital/deposit/subAddress": 1,
"capital/deposit/subHisrec": 1,
"capital/deposit/subHisrec/getall": 1,
},
"post": map[string]interface{} {
"sub-account/virtualSubAccount": 1,
"sub-account/apiKey": 1,
"capital/deposit/subAddress": 1,
"capital/withdraw/apply": 1,
"sub-account/universalTransfer": 1,
"sub-account/futures": 1,
},
"delete": map[string]interface{} {
"sub-account/apiKey": 1,
},
},
},
},
"precisionMode": TICK_SIZE,
"timeframes": map[string]interface{} {
"1m": "1m",
"5m": "5m",
"15m": "15m",
"30m": "30m",
"1h": "1h",
"4h": "4h",
"8h": "8h",
"1d": "1d",
"1w": "1w",
"1M": "1M",
},
"fees": map[string]interface{} {
"trading": map[string]interface{} {
"tierBased": false,
"percentage": true,
"maker": this.ParseNumber("0.002"),
"taker": this.ParseNumber("0.002"),
},
},
"options": map[string]interface{} {
"adjustForTimeDifference": false,
"timeDifference": 0,
"unavailableContracts": map[string]interface{} {
"BTC/USDT:USDT": true,
"LTC/USDT:USDT": true,
"ETH/USDT:USDT": true,
},
"fetchMarkets": map[string]interface{} {
"types": map[string]interface{} {
"spot": true,
"swap": map[string]interface{} {
"linear": true,
"inverse": false,
},
},
},
"timeframes": map[string]interface{} {
"spot": map[string]interface{} {
"1m": "1m",
"5m": "5m",
"15m": "15m",
"30m": "30m",
"1h": "60m",
"4h": "4h",
"1d": "1d",
"1w": "1W",
"1M": "1M",
},
"swap": map[string]interface{} {
"1m": "Min1",
"5m": "Min5",
"15m": "Min15",
"30m": "Min30",
"1h": "Min60",
"4h": "Hour4",
"8h": "Hour8",
"1d": "Day1",
"1w": "Week1",
"1M": "Month1",
},
},
"defaultType": "spot",
"defaultNetwork": "ETH",
"defaultNetworks": map[string]interface{} {
"ETH": "ETH",
"USDT": "ERC20",
"USDC": "ERC20",
"BTC": "BTC",
"LTC": "LTC",
},
"networks": map[string]interface{} {
"ZKSYNC": "ZKSYNCERA",
"TRC20": "TRX",
"TON": "TONCOIN",
"AVAXC": "AVAX_CCHAIN",
"ERC20": "ETH",
"ACA": "ACALA",
"BEP20": "BSC",
"OPTIMISM": "OP",
"ASTR": "ASTAR",
"BTM": "BTM2",
"CRC20": "CRONOS",
"ETHF": "ETF",
"HRC20": "HECO",
"OASIS": "ROSE",
"OKC": "OKT",
"RSK": "RBTC",
},
"networksById": map[string]interface{} {
"BNB Smart Chain(BEP20-RACAV1)": "BSC",
"BNB Smart Chain(BEP20-RACAV2)": "BSC",
"BNB Smart Chain(BEP20)": "BSC",
},
"recvWindow": Multiply(5, 1000),
"maxTimeTillEnd": Subtract(Multiply(Multiply(90, 86400), 1000), 1),
"broker": "CCXT",
},
"features": map[string]interface{} {
"default": map[string]interface{} {
"sandbox": false,
"createOrder": map[string]interface{} {
"marginMode": true,
"triggerPrice": false,
"triggerDirection": false,
"triggerPriceType": map[string]interface{} {
"last": false,
"mark": false,
"index": false,
},
"stopLossPrice": false,
"takeProfitPrice": false,
"attachedStopLossTakeProfit": nil,
"timeInForce": map[string]interface{} {
"IOC": true,
"FOK": true,
"PO": true,
"GTD": false,
},
"hedged": true,
"trailing": false,
"leverage": true,
"marketBuyByCost": true,
"marketBuyRequiresPrice": false,
"selfTradePrevention": false,
"iceberg": false,
},
"createOrders": map[string]interface{} {
"max": 20,
},
"fetchMyTrades": map[string]interface{} {
"marginMode": false,
"limit": 100,
"daysBack": 30,
"untilDays": nil,
"symbolRequired": true,
},
"fetchOrder": map[string]interface{} {
"marginMode": false,
"trigger": false,
"trailing": false,
"symbolRequired": true,
},
"fetchOpenOrders": map[string]interface{} {
"marginMode": true,
"limit": nil,
"trigger": false,
"trailing": false,
"symbolRequired": true,
},
"fetchOrders": map[string]interface{} {
"marginMode": true,
"limit": 1000,
"daysBack": 7,
"untilDays": 7,
"trigger": false,
"trailing": false,
"symbolRequired": true,
},
"fetchClosedOrders": map[string]interface{} {
"marginMode": true,
"limit": 1000,
"daysBack": 7,
"daysBackCanceled": 7,
"untilDays": 7,
"trigger": false,
"trailing": false,
"symbolRequired": true,
},
"fetchOHLCV": map[string]interface{} {
"limit": 1000,
},
},
"spot": map[string]interface{} {
"extends": "default",
},
"forDerivs": map[string]interface{} {
"extends": "default",
"createOrder": map[string]interface{} {
"triggerPrice": true,
"triggerPriceType": map[string]interface{} {
"last": true,
"mark": true,
"index": true,
},
"triggerDirection": true,
"stopLossPrice": false,
"takeProfitPrice": false,
"hedged": true,
"leverage": true,
"marketBuyByCost": false,
},
"createOrders": nil,
"fetchMyTrades": map[string]interface{} {
"marginMode": false,
"limit": 100,
"daysBack": 90,
"untilDays": 90,
},
"fetchOrder": map[string]interface{} {
"marginMode": false,
},
"fetchOpenOrders": map[string]interface{} {
"marginMode": false,
"limit": 100,
"trigger": true,
"trailing": false,
},
"fetchOrders": map[string]interface{} {
"marginMode": false,
"limit": 100,
"daysBack": 90,
"untilDays": 90,
"trigger": true,
"trailing": false,
},
"fetchClosedOrders": map[string]interface{} {
"marginMode": false,
"limit": 100,
"daysBack": 90,
"daysBackCanceled": nil,
"untilDays": 90,
"trigger": true,
"trailing": false,
},
"fetchOHLCV": map[string]interface{} {
"limit": 2000,
},
},
"swap": map[string]interface{} {
"linear": map[string]interface{} {
"extends": "forDerivs",
},
"inverse": map[string]interface{} {
"extends": "forDerivs",
},
},
"future": map[string]interface{} {
"linear": nil,
"inverse": nil,
},
},
"commonCurrencies": map[string]interface{} {
"BEYONDPROTOCOL": "BEYOND",
"BIFI": "BIFIF",
"BYN": "BEYONDFI",
"COFI": "COFIX",
"DFI": "DFISTARTER",
"DFT": "DFUTURE",
"DRK": "DRK",
"EGC": "EGORASCREDIT",
"FLUX1": "FLUX",
"FLUX": "FLUX1",
"FREE": "FREEROSSDAO",
"GAS": "GASDAO",
"GASNEO": "GAS",
"GMT": "GMTTOKEN",
"STEPN": "GMT",
"HERO": "STEPHERO",
"MIMO": "MIMOSA",
"PROS": "PROSFINANCE",
"SIN": "SINCITYTOKEN",
"SOUL": "SOULSWAP",
},
"exceptions": map[string]interface{} {
"exact": map[string]interface{} {
"-1128": BadRequest,
"-2011": BadRequest,
"-1121": BadSymbol,
"10101": InsufficientFunds,
"2009": InvalidOrder,
"2011": BadRequest,
"30004": InsufficientFunds,
"33333": BadRequest,
"44444": BadRequest,
"1002": InvalidOrder,
"30019": BadRequest,
"30005": InvalidOrder,
"2003": InvalidOrder,
"2005": InsufficientFunds,
"400": BadRequest,
"600": BadRequest,
"70011": PermissionDenied,
"88004": InsufficientFunds,
"88009": ExchangeError,
"88013": InvalidOrder,
"88015": InsufficientFunds,
"700003": InvalidNonce,
"26": ExchangeError,
"602": AuthenticationError,
"10001": AuthenticationError,
"10007": BadSymbol,
"10015": BadRequest,
"10072": BadRequest,
"10073": BadRequest,
"10095": InvalidOrder,
"10096": InvalidOrder,
"10097": InvalidOrder,
"10098": InvalidOrder,
"10099": BadRequest,
"10100": BadRequest,
"10102": InvalidOrder,
"10103": ExchangeError,
"10200": BadRequest,
"10201": BadRequest,
"10202": BadRequest,
"10206": BadRequest,
"10211": BadRequest,
"10212": BadRequest,
"10216": ExchangeError,
"10219": ExchangeError,
"10222": BadRequest,
"10232": BadRequest,
"10259": ExchangeError,
"10265": ExchangeError,
"10268": BadRequest,
"20001": ExchangeError,
"20002": ExchangeError,
"22222": BadRequest,
"30000": ExchangeError,
"30001": InvalidOrder,
"30002": InvalidOrder,
"30003": InvalidOrder,
"30010": InvalidOrder,
"30014": InvalidOrder,
"30016": InvalidOrder,
"30018": AccountSuspended,
"30020": AuthenticationError,
"30021": BadRequest,
"30025": InvalidOrder,
"30026": BadRequest,
"30027": InvalidOrder,
"30028": InvalidOrder,
"30029": InvalidOrder,
"30032": InvalidOrder,
"30041": InvalidOrder,
"60005": ExchangeError,
"700001": AuthenticationError,
"700002": AuthenticationError,
"700004": BadRequest,
"700005": InvalidNonce,
"700006": BadRequest,
"700007": AuthenticationError,
"700008": BadRequest,
"700013": AuthenticationError,
"730001": BadRequest,
"730002": BadRequest,
"730000": ExchangeError,
"730003": ExchangeError,
"730100": ExchangeError,
"730600": BadRequest,
"730601": BadRequest,
"730602": BadRequest,
"730700": BadRequest,
"730701": BadRequest,
"730702": BadRequest,
"730703": BadRequest,
"730704": BadRequest,
"730705": BadRequest,
"730706": BadRequest,
"730707": BadRequest,
"730101": BadRequest,
"140001": BadRequest,
"140002": AuthenticationError,
},
"broad": map[string]interface{} {
"Order quantity error, please try to modify.": BadRequest,
"Combination of optional parameters invalid": BadRequest,
"api market order is disabled": BadRequest,
"Contract not allow place order!": InvalidOrder,
"Oversold": InsufficientFunds,
"Insufficient position": InsufficientFunds,
"Insufficient balance!": InsufficientFunds,
"Bid price is great than max allow price": InvalidOrder,
"Invalid symbol.": BadSymbol,
"Param error!": BadRequest,
"maintenance": OnMaintenance,
},
},
})
}
/**
* @method
* @name mexc#fetchStatus
* @description the latest known information on the availability of the exchange API
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#test-connectivity
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-server-time
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [status structure]{@link https://docs.ccxt.com/#/?id=exchange-status-structure}
*/
func (this *mexc) FetchStatus(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
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchStatus", nil, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
var response interface{} = nil
var status interface{} = nil
var updated interface{} = nil
if IsTrue(IsEqual(marketType, "spot")) {
response = (<-this.SpotPublicGetPing(query))
PanicOnError(response)
//
// {}
//
var keys interface{} = ObjectKeys(response)
var length interface{} = GetArrayLength(keys)
status = Ternary(IsTrue(length), this.Json(response), "ok")
} else if IsTrue(IsEqual(marketType, "swap")) {
response = (<-this.ContractPublicGetPing(query))
PanicOnError(response)
//
// {"success":true,"code":"0","data":"1648124374985"}
//
status = Ternary(IsTrue(this.SafeValue(response, "success")), "ok", this.Json(response))
updated = this.SafeInteger(response, "data")
}
ch <- map[string]interface{} {
"status": status,
"updated": updated,
"url": nil,
"eta": nil,
"info": response,
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchTime
* @description fetches the current integer timestamp in milliseconds from the exchange server
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#check-server-time
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-server-time
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {int} the current integer timestamp in milliseconds from the exchange server
*/
func (this *mexc) 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
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchTime", nil, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
var response interface{} = nil
if IsTrue(IsEqual(marketType, "spot")) {
response = (<-this.SpotPublicGetTime(query))
PanicOnError(response)
//
// {"serverTime": "1647519277579"}
//
ch <- this.SafeInteger(response, "serverTime")
return nil
} else if IsTrue(IsEqual(marketType, "swap")) {
response = (<-this.ContractPublicGetPing(query))
PanicOnError(response)
//
// {"success":true,"code":"0","data":"1648124374985"}
//
ch <- this.SafeInteger(response, "data")
return nil
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchCurrencies
* @description fetches all available currencies on an exchange
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#query-the-currency-information
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an associative dictionary of currencies
*/
func (this *mexc) FetchCurrencies(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
// this endpoint requires authentication
// while fetchCurrencies is a public API method by design
// therefore we check the keys here
// and fallback to generating the currencies from the markets
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
if !IsTrue(this.CheckRequiredCredentials(false)) {
return nil
}
response:= (<-this.SpotPrivateGetCapitalConfigGetall(params))
PanicOnError(response)
//
// {
// "coin": "QANX",
// "name": "QANplatform",
// "networkList": [
// {
// "coin": "QANX",
// "depositDesc": null,
// "depositEnable": true,
// "minConfirm": "0",
// "name": "QANplatform",
// "network": "BEP20(BSC)",
// "withdrawEnable": false,
// "withdrawFee": "42.000000000000000000",
// "withdrawIntegerMultiple": null,
// "withdrawMax": "24000000.000000000000000000",
// "withdrawMin": "20.000000000000000000",
// "sameAddress": false,
// "contract": "0xAAA7A10a8ee237ea61E8AC46C50A8Db8bCC1baaa"
// },
// {
// "coin": "QANX",
// "depositDesc": null,
// "depositEnable": true,
// "minConfirm": "0",
// "name": "QANplatform",
// "network": "ERC20",
// "withdrawEnable": true,
// "withdrawFee": "2732.000000000000000000",
// "withdrawIntegerMultiple": null,
// "withdrawMax": "24000000.000000000000000000",
// "withdrawMin": "240.000000000000000000",
// "sameAddress": false,
// "contract": "0xAAA7A10a8ee237ea61E8AC46C50A8Db8bCC1baaa"
// }
// ]
// }
//
var result interface{} = map[string]interface{} {}
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var currency interface{} = GetValue(response, i)
var id interface{} = this.SafeString(currency, "coin")
var code interface{} = this.SafeCurrencyCode(id)
var name interface{} = this.SafeString(currency, "name")
var currencyActive interface{} = false
var currencyFee interface{} = nil
var currencyWithdrawMin interface{} = nil
var currencyWithdrawMax interface{} = nil
var depositEnabled interface{} = false
var withdrawEnabled interface{} = false
var networks interface{} = map[string]interface{} {}
var chains interface{} = this.SafeValue(currency, "networkList", []interface{}{})
for j := 0; IsLessThan(j, GetArrayLength(chains)); j++ {
var chain interface{} = GetValue(chains, j)
var networkId interface{} = this.SafeString2(chain, "netWork", "network")
var network interface{} = this.NetworkIdToCode(networkId)
var isDepositEnabled interface{} = this.SafeBool(chain, "depositEnable", false)
var isWithdrawEnabled interface{} = this.SafeBool(chain, "withdrawEnable", false)
var active interface{} = (IsTrue(isDepositEnabled) && IsTrue(isWithdrawEnabled))
currencyActive = IsTrue(active) || IsTrue(currencyActive)
var withdrawMin interface{} = this.SafeString(chain, "withdrawMin")
var withdrawMax interface{} = this.SafeString(chain, "withdrawMax")
currencyWithdrawMin = Ternary(IsTrue((IsEqual(currencyWithdrawMin, nil))), withdrawMin, currencyWithdrawMin)
currencyWithdrawMax = Ternary(IsTrue((IsEqual(currencyWithdrawMax, nil))), withdrawMax, currencyWithdrawMax)
var fee interface{} = this.SafeNumber(chain, "withdrawFee")
currencyFee = Ternary(IsTrue((IsEqual(currencyFee, nil))), fee, currencyFee)
if IsTrue(Precise.StringGt(currencyWithdrawMin, withdrawMin)) {
currencyWithdrawMin = withdrawMin
}
if IsTrue(Precise.StringLt(currencyWithdrawMax, withdrawMax)) {
currencyWithdrawMax = withdrawMax
}
if IsTrue(isDepositEnabled) {
depositEnabled = true
}
if IsTrue(isWithdrawEnabled) {
withdrawEnabled = true
}
AddElementToObject(networks, network, map[string]interface{} {
"info": chain,
"id": networkId,
"network": network,
"active": active,
"deposit": isDepositEnabled,
"withdraw": isWithdrawEnabled,
"fee": fee,
"precision": nil,
"limits": map[string]interface{} {
"withdraw": map[string]interface{} {
"min": withdrawMin,
"max": withdrawMax,
},
},
})
}
var networkKeys interface{} = ObjectKeys(networks)
var networkKeysLength interface{} = GetArrayLength(networkKeys)
if IsTrue(IsTrue((IsEqual(networkKeysLength, 1))) || IsTrue((InOp(networks, "NONE")))) {
var defaultNetwork interface{} = this.SafeValue2(networks, "NONE", Subtract(networkKeysLength, 1))
if IsTrue(!IsEqual(defaultNetwork, nil)) {
currencyFee = GetValue(defaultNetwork, "fee")
}
}
AddElementToObject(result, code, map[string]interface{} {
"info": currency,
"id": id,
"code": code,
"name": name,
"active": currencyActive,
"deposit": depositEnabled,
"withdraw": withdrawEnabled,
"fee": currencyFee,
"precision": nil,
"limits": map[string]interface{} {
"amount": map[string]interface{} {
"min": nil,
"max": nil,
},
"withdraw": map[string]interface{} {
"min": currencyWithdrawMin,
"max": currencyWithdrawMax,
},
},
"networks": networks,
})
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchMarkets
* @description retrieves data on all markets for mexc
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#exchange-information
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-contract-information
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} an array of objects representing market data
*/
func (this *mexc) 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")) {
retRes118912 := (<-this.LoadTimeDifference())
PanicOnError(retRes118912)
}
var spotMarketPromise interface{} = this.FetchSpotMarkets(params)
var swapMarketPromise interface{} = this.FetchSwapMarkets(params)
spotMarketswapMarketVariable := (<-promiseAll([]interface{}{spotMarketPromise, swapMarketPromise}));
spotMarket := GetValue(spotMarketswapMarketVariable,0);
swapMarket := GetValue(spotMarketswapMarketVariable,1)
ch <- this.ArrayConcat(spotMarket, swapMarket)
return nil
}()
return ch
}
/**
* @ignore
* @method
* @name mexc#fetchMarkets
* @description retrieves data on all spot markets for mexc
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#exchange-information
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} an array of objects representing market data
*/
func (this *mexc) 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
response:= (<-this.SpotPublicGetExchangeInfo(params))
PanicOnError(response)
//
// {
// "timezone": "CST",
// "serverTime": 1647521860402,
// "rateLimits": [],
// "exchangeFilters": [],
// "symbols": [
// {
// "symbol": "OGNUSDT",
// "status": "1",
// "baseAsset": "OGN",
// "baseAssetPrecision": "2",
// "quoteAsset": "USDT",
// "quoteAssetPrecision": "4",
// "orderTypes": [
// "LIMIT",
// "LIMIT_MAKER"
// ],
// "baseCommissionPrecision": "2",
// "quoteCommissionPrecision": "4",
// "quoteOrderQtyMarketAllowed": false,
// "isSpotTradingAllowed": true,
// "isMarginTradingAllowed": true,
// "permissions": [
// "SPOT",
// "MARGIN"
// ],
// "filters": [],
// "baseSizePrecision": "0.01", // this turned out to be a minimum base amount for order
// "maxQuoteAmount": "5000000",
// "makerCommission": "0.002",
// "takerCommission": "0.002"
// "quoteAmountPrecision": "5", // this turned out to be a minimum cost amount for order
// "quotePrecision": "4", // deprecated in favor of 'quoteAssetPrecision' ( https://dev.binance.vision/t/what-is-the-difference-between-quoteprecision-and-quoteassetprecision/4333 )
// // note, "icebergAllowed" & "ocoAllowed" fields were recently removed
// },
// ]
// }
//
// Notes:
// - 'quoteAssetPrecision' & 'baseAssetPrecision' are not currency's real blockchain precision (to view currency's actual individual precision, refer to fetchCurrencies() method).
//
var data interface{} = this.SafeValue(response, "symbols", []interface{}{})
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
var market interface{} = GetValue(data, i)
var id interface{} = this.SafeString(market, "symbol")
var baseId interface{} = this.SafeString(market, "baseAsset")
var quoteId interface{} = this.SafeString(market, "quoteAsset")
var base interface{} = this.SafeCurrencyCode(baseId)
var quote interface{} = this.SafeCurrencyCode(quoteId)
var status interface{} = this.SafeString(market, "status")
var isSpotTradingAllowed interface{} = this.SafeValue(market, "isSpotTradingAllowed")
var active interface{} = false
if IsTrue(IsTrue((IsEqual(status, "1"))) && IsTrue((isSpotTradingAllowed))) {
active = true
}
var isMarginTradingAllowed interface{} = this.SafeValue(market, "isMarginTradingAllowed")
var makerCommission interface{} = this.SafeNumber(market, "makerCommission")
var takerCommission interface{} = this.SafeNumber(market, "takerCommission")
var maxQuoteAmount interface{} = this.SafeNumber(market, "maxQuoteAmount")
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": isMarginTradingAllowed,
"swap": false,
"future": false,
"option": false,
"active": active,
"contract": false,
"linear": nil,
"inverse": nil,
"taker": takerCommission,
"maker": makerCommission,
"contractSize": nil,
"expiry": nil,
"expiryDatetime": nil,
"strike": nil,
"optionType": nil,
"precision": map[string]interface{} {
"amount": this.ParseNumber(this.ParsePrecision(this.SafeString(market, "baseAssetPrecision"))),
"price": this.ParseNumber(this.ParsePrecision(this.SafeString(market, "quoteAssetPrecision"))),
},
"limits": map[string]interface{} {
"leverage": map[string]interface{} {
"min": nil,
"max": nil,
},
"amount": map[string]interface{} {
"min": this.SafeNumber(market, "baseSizePrecision"),
"max": nil,
},
"price": map[string]interface{} {
"min": nil,
"max": nil,
},
"cost": map[string]interface{} {
"min": this.SafeNumber(market, "quoteAmountPrecision"),
"max": maxQuoteAmount,
},
},
"created": nil,
"info": market,
})
}
ch <- result
return nil
}()
return ch
}
/**
* @ignore
* @method
* @name mexc#fetchMarkets
* @description retrieves data on all swap markets for mexc
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-contract-information
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} an array of objects representing market data
*/
func (this *mexc) FetchSwapMarkets(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 currentRl interface{} = this.RateLimit
this.SetProperty(this, "rateLimit", 10) // see comment: https://github.com/ccxt/ccxt/pull/23698
response:= (<-this.ContractPublicGetDetail(params))
PanicOnError(response)
this.SetProperty(this, "rateLimit", currentRl)
//
// {
// "success":true,
// "code":0,
// "data":[
// {
// "symbol":"BTC_USDT",
// "displayName":"BTC_USDT永续",
// "displayNameEn":"BTC_USDT SWAP",
// "positionOpenType":3,
// "baseCoin":"BTC",
// "quoteCoin":"USDT",
// "settleCoin":"USDT",
// "contractSize":0.0001,
// "minLeverage":1,
// "maxLeverage":125,
// "priceScale":2, // seems useless atm, as it's just how UI shows the price, i.e. 29583.50 for BTC/USDT:USDT, while price ticksize is 0.5
// "volScale":0, // probably: contract amount precision
// "amountScale":4, // probably: quote currency precision
// "priceUnit":0.5, // price tick size
// "volUnit":1, // probably: contract tick size
// "minVol":1,
// "maxVol":1000000,
// "bidLimitPriceRate":0.1,
// "askLimitPriceRate":0.1,
// "takerFeeRate":0.0006,
// "makerFeeRate":0.0002,
// "maintenanceMarginRate":0.004,
// "initialMarginRate":0.008,
// "riskBaseVol":10000,
// "riskIncrVol":200000,
// "riskIncrMmr":0.004,
// "riskIncrImr":0.004,
// "riskLevelLimit":5,
// "priceCoefficientVariation":0.1,
// "indexOrigin":["BINANCE","GATEIO","HUOBI","MXC"],
// "state":0, // 0 enabled, 1 delivery, 2 completed, 3 offline, 4 pause
// "isNew":false,
// "isHot":true,
// "isHidden":false
// },
// ]
// }
//
var data interface{} = this.SafeValue(response, "data", []interface{}{})
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
var market interface{} = GetValue(data, i)
var id interface{} = this.SafeString(market, "symbol")
var baseId interface{} = this.SafeString(market, "baseCoin")
var quoteId interface{} = this.SafeString(market, "quoteCoin")
var settleId interface{} = this.SafeString(market, "settleCoin")
var base interface{} = this.SafeCurrencyCode(baseId)
var quote interface{} = this.SafeCurrencyCode(quoteId)
var settle interface{} = this.SafeCurrencyCode(settleId)
var state interface{} = this.SafeString(market, "state")
var isLinear interface{} = IsEqual(quote, settle)
AppendToArray(&result,map[string]interface{} {
"id": id,
"symbol": Add(Add(Add(Add(base, "/"), quote), ":"), settle),
"base": base,
"quote": quote,
"settle": settle,
"baseId": baseId,
"quoteId": quoteId,
"settleId": settleId,
"type": "swap",
"spot": false,
"margin": false,
"swap": true,
"future": false,
"option": false,
"active": (IsEqual(state, "0")),
"contract": true,
"linear": isLinear,
"inverse": !IsTrue(isLinear),
"taker": this.SafeNumber(market, "takerFeeRate"),
"maker": this.SafeNumber(market, "makerFeeRate"),
"contractSize": this.SafeNumber(market, "contractSize"),
"expiry": nil,
"expiryDatetime": nil,
"strike": nil,
"optionType": nil,
"precision": map[string]interface{} {
"amount": this.SafeNumber(market, "volUnit"),
"price": this.SafeNumber(market, "priceUnit"),
},
"limits": map[string]interface{} {
"leverage": map[string]interface{} {
"min": this.SafeNumber(market, "minLeverage"),
"max": this.SafeNumber(market, "maxLeverage"),
},
"amount": map[string]interface{} {
"min": this.SafeNumber(market, "minVol"),
"max": this.SafeNumber(market, "maxVol"),
},
"price": map[string]interface{} {
"min": nil,
"max": nil,
},
"cost": map[string]interface{} {
"min": nil,
"max": nil,
},
},
"created": nil,
"info": market,
})
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchOrderBook
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#order-book
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-contract-s-depth-information
* @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
* @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 *mexc) 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
retRes14628 := (<-this.LoadMarkets())
PanicOnError(retRes14628)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var orderbook interface{} = nil
if IsTrue(GetValue(market, "spot")) {
response:= (<-this.SpotPublicGetDepth(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "lastUpdateId": "744267132",
// "bids": [
// ["40838.50","0.387864"],
// ["40837.95","0.008400"],
// ],
// "asks": [
// ["40838.61","6.544908"],
// ["40838.88","0.498000"],
// ]
// }
//
var spotTimestamp interface{} = this.SafeInteger(response, "timestamp")
orderbook = this.ParseOrderBook(response, symbol, spotTimestamp)
AddElementToObject(orderbook, "nonce", this.SafeInteger(response, "lastUpdateId"))
} else if IsTrue(GetValue(market, "swap")) {
response:= (<-this.ContractPublicGetDepthSymbol(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success":true,
// "code":0,
// "data":{
// "asks":[
// [3445.72,48379,1],
// [3445.75,34994,1],
// ],
// "bids":[
// [3445.55,44081,1],
// [3445.51,24857,1],
// ],
// "version":2827730444,
// "timestamp":1634117846232
// }
// }
//
var data interface{} = this.SafeValue(response, "data")
var timestamp interface{} = this.SafeInteger(data, "timestamp")
orderbook = this.ParseOrderBook(data, symbol, timestamp)
AddElementToObject(orderbook, "nonce", this.SafeInteger(data, "version"))
}
ch <- orderbook
return nil
}()
return ch
}
func (this *mexc) ParseBidAsk(bidask interface{}, optionalArgs ...interface{}) interface{} {
priceKey := GetArg(optionalArgs, 0, 0)
_ = priceKey
amountKey := GetArg(optionalArgs, 1, 1)
_ = amountKey
countOrIdKey := GetArg(optionalArgs, 2, 2)
_ = countOrIdKey
var countKey interface{} = 2
var price interface{} = this.SafeNumber(bidask, priceKey)
var amount interface{} = this.SafeNumber(bidask, amountKey)
var count interface{} = this.SafeNumber(bidask, countKey)
if IsTrue(!IsEqual(count, nil)) {
return []interface{}{price, amount, count}
}
return []interface{}{price, amount}
}
/**
* @method
* @name mexc#fetchTrades
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#recent-trades-list
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#compressed-aggregate-trades-list
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-contract-transaction-data
* @description get the list of most recent trades for a particular symbol
* @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] *spot only* *since must be defined* the latest time in ms to fetch entries for
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
*/
func (this *mexc) 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
retRes15438 := (<-this.LoadMarkets())
PanicOnError(retRes15438)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var trades interface{} = nil
if IsTrue(GetValue(market, "spot")) {
var until interface{} = this.SafeIntegerN(params, []interface{}{"endTime", "until"})
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
if IsTrue(IsEqual(until, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchTrades() requires an until parameter when since is provided")))
}
}
if IsTrue(!IsEqual(until, nil)) {
if IsTrue(IsEqual(since, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchTrades() requires a since parameter when until is provided")))
}
AddElementToObject(request, "endTime", until)
}
var method interface{} = this.SafeString(this.Options, "fetchTradesMethod", "spotPublicGetAggTrades")
method = this.SafeString(params, "method", method) // AggTrades, HistoricalTrades, Trades
params = this.Omit(params, []interface{}{"method"})
if IsTrue(IsEqual(method, "spotPublicGetAggTrades")) {
trades = (<-this.SpotPublicGetAggTrades(this.Extend(request, params)))
PanicOnError(trades)
} else if IsTrue(IsEqual(method, "spotPublicGetHistoricalTrades")) {
trades = (<-this.SpotPublicGetHistoricalTrades(this.Extend(request, params)))
PanicOnError(trades)
} else if IsTrue(IsEqual(method, "spotPublicGetTrades")) {
trades = (<-this.SpotPublicGetTrades(this.Extend(request, params)))
PanicOnError(trades)
} else {
panic(NotSupported(Add(this.Id, " fetchTrades() not support this method")))
}
} else if IsTrue(GetValue(market, "swap")) {
response:= (<-this.ContractPublicGetDealsSymbol(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "code": 0,
// "data": [
// {
// "p": 31199,
// "v": 18,
// "T": 1,
// "O": 3,
// "M": 2,
// "t": 1609831235985
// },
// ]
// }
//
trades = this.SafeValue(response, "data")
}
ch <- this.ParseTrades(trades, market, since, limit)
return nil
}()
return ch
}
func (this *mexc) ParseTrade(trade interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var id interface{} = nil
var timestamp interface{} = nil
var orderId interface{} = nil
var symbol interface{} = nil
var fee interface{} = nil
var typeVar interface{} = nil
var side interface{} = nil
var takerOrMaker interface{} = nil
var priceString interface{} = nil
var amountString interface{} = nil
var costString interface{} = nil
// if swap
if IsTrue(InOp(trade, "v")) {
//
// swap: fetchTrades
//
// {
// "p": 31199,
// "v": 18,
// "T": 1,
// "O": 3,
// "M": 2,
// "t": 1609831235985
// }
//
timestamp = this.SafeInteger(trade, "t")
market = this.SafeMarket(nil, market)
symbol = GetValue(market, "symbol")
priceString = this.SafeString(trade, "p")
amountString = this.SafeString(trade, "v")
side = this.ParseOrderSide(this.SafeString(trade, "T"))
takerOrMaker = "taker"
} else {
//
// spot: fetchTrades (for aggTrades)
//
// {
// "a": null,
// "f": null,
// "l": null,
// "p": "40679",
// "q": "0.001309",
// "T": 1647551328000,
// "m": true,
// "M": true
// }
//
// spot: fetchMyTrades, fetchOrderTrades
//
// {
// "symbol": "BTCUSDT",
// "id": "133948532984922113",
// "orderId": "133948532531949568",
// "orderListId": "-1",
// "price": "41995.51",
// "qty": "0.0002",
// "quoteQty": "8.399102",
// "commission": "0.016798204",
// "commissionAsset": "USDT",
// "time": "1647718055000",
// "isBuyer": true,
// "isMaker": false,
// "isBestMatch": true
// }
//
// swap: fetchMyTrades, fetchOrderTrades
//
// {
// "id": "299444585",
// "symbol": "STEPN_USDT",
// "side": "1",
// "vol": "1",
// "price": "2.45455",
// "feeCurrency": "USDT",
// "fee": "0.00147273",
// "timestamp": "1648924557000",
// "profit": "0",
// "category": "1",
// "orderId": "265307163526610432",
// "positionMode": "1",
// "taker": true
// }
//
var marketId interface{} = this.SafeString(trade, "symbol")
market = this.SafeMarket(marketId, market)
symbol = GetValue(market, "symbol")
id = this.SafeString2(trade, "id", "a")
priceString = this.SafeString2(trade, "price", "p")
orderId = this.SafeString(trade, "orderId")
// if swap
if IsTrue(InOp(trade, "positionMode")) {
timestamp = this.SafeInteger(trade, "timestamp")
amountString = this.SafeString(trade, "vol")
side = this.ParseOrderSide(this.SafeString(trade, "side"))
fee = map[string]interface{} {
"cost": this.SafeString(trade, "fee"),
"currency": this.SafeCurrencyCode(this.SafeString(trade, "feeCurrency")),
}
takerOrMaker = Ternary(IsTrue(this.SafeValue(trade, "taker")), "taker", "maker")
} else {
timestamp = this.SafeInteger2(trade, "time", "T")
amountString = this.SafeString2(trade, "qty", "q")
costString = this.SafeString(trade, "quoteQty")
var isBuyer interface{} = this.SafeValue(trade, "isBuyer")
var isMaker interface{} = this.SafeValue(trade, "isMaker")
var buyerMaker interface{} = this.SafeValue2(trade, "isBuyerMaker", "m")
if IsTrue(!IsEqual(isMaker, nil)) {
takerOrMaker = Ternary(IsTrue(isMaker), "maker", "taker")
}
if IsTrue(!IsEqual(isBuyer, nil)) {
side = Ternary(IsTrue(isBuyer), "buy", "sell")
}
if IsTrue(!IsEqual(buyerMaker, nil)) {
side = Ternary(IsTrue(buyerMaker), "sell", "buy")
takerOrMaker = "taker"
}
var feeAsset interface{} = this.SafeString(trade, "commissionAsset")
if IsTrue(!IsEqual(feeAsset, nil)) {
fee = map[string]interface{} {
"cost": this.SafeString(trade, "commission"),
"currency": this.SafeCurrencyCode(feeAsset),
}
}
}
}
if IsTrue(IsEqual(id, nil)) {
id = this.SyntheticTradeId(market, timestamp, side, amountString, priceString, typeVar, takerOrMaker)
}
return this.SafeTrade(map[string]interface{} {
"id": id,
"order": orderId,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"symbol": symbol,
"type": typeVar,
"side": side,
"takerOrMaker": takerOrMaker,
"price": priceString,
"amount": amountString,
"cost": costString,
"fee": fee,
"info": trade,
}, market)
}
func (this *mexc) SyntheticTradeId(optionalArgs ...interface{}) interface{} {
// TODO: can be unified method? this approach is being used by multiple exchanges (mexc, woo-coinsbit, dydx, ...)
market := GetArg(optionalArgs, 0, nil)
_ = market
timestamp := GetArg(optionalArgs, 1, nil)
_ = timestamp
side := GetArg(optionalArgs, 2, nil)
_ = side
amount := GetArg(optionalArgs, 3, nil)
_ = amount
price := GetArg(optionalArgs, 4, nil)
_ = price
orderType := GetArg(optionalArgs, 5, nil)
_ = orderType
takerOrMaker := GetArg(optionalArgs, 6, nil)
_ = takerOrMaker
var id interface{} = ""
if IsTrue(!IsEqual(timestamp, nil)) {
id = Add(Add(this.NumberToString(timestamp), "-"), this.SafeString(market, "id", "_"))
if IsTrue(!IsEqual(side, nil)) {
id = Add(id, Add("-", side))
}
if IsTrue(!IsEqual(amount, nil)) {
id = Add(id, Add("-", this.NumberToString(amount)))
}
if IsTrue(!IsEqual(price, nil)) {
id = Add(id, Add("-", this.NumberToString(price)))
}
if IsTrue(!IsEqual(takerOrMaker, nil)) {
id = Add(id, Add("-", takerOrMaker))
}
if IsTrue(!IsEqual(orderType, nil)) {
id = Add(id, Add("-", orderType))
}
}
return id
}
/**
* @method
* @name mexc#fetchOHLCV
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#kline-candlestick-data
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#k-line-data
* @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
* @param {string} symbol unified symbol of the market to fetch OHLCV data for
* @param {string} timeframe the length of time each candle represents
* @param {int} [since] timestamp in ms of the earliest candle to fetch
* @param {int} [limit] the maximum amount of candles to fetch
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] timestamp in ms of the latest candle to fetch
* @param {boolean} [params.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
*/
func (this *mexc) 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
retRes18178 := (<-this.LoadMarkets())
PanicOnError(retRes18178)
var market interface{} = this.Market(symbol)
var maxLimit interface{} = Ternary(IsTrue((GetValue(market, "spot"))), 1000, 2000)
var paginate interface{} = false
paginateparamsVariable := this.HandleOptionAndParams(params, "fetchOHLCV", "paginate", false);
paginate = GetValue(paginateparamsVariable,0);
params = GetValue(paginateparamsVariable,1)
if IsTrue(paginate) {
retRes182319 := (<-this.FetchPaginatedCallDeterministic("fetchOHLCV", symbol, since, limit, timeframe, params, maxLimit))
PanicOnError(retRes182319)
ch <- retRes182319
return nil
}
var options interface{} = this.SafeValue(this.Options, "timeframes", map[string]interface{} {})
var timeframes interface{} = this.SafeValue(options, GetValue(market, "type"), map[string]interface{} {})
var timeframeValue interface{} = this.SafeString(timeframes, timeframe)
var duration interface{} = Multiply(this.ParseTimeframe(timeframe), 1000)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"interval": timeframeValue,
}
var candles interface{} = nil
if IsTrue(GetValue(market, "spot")) {
var until interface{} = this.SafeIntegerN(params, []interface{}{"until", "endTime"})
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
if IsTrue(IsEqual(until, nil)) {
// we have to calculate it assuming we can get at most 2000 entries per request
var end interface{} = this.Sum(since, Multiply(maxLimit, duration))
var now interface{} = this.Milliseconds()
AddElementToObject(request, "endTime", mathMin(end, now))
}
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
if IsTrue(!IsEqual(until, nil)) {
params = this.Omit(params, []interface{}{"until"})
AddElementToObject(request, "endTime", until)
}
response:= (<-this.SpotPublicGetKlines(this.Extend(request, params)))
PanicOnError(response)
//
// [
// [
// 1640804880000,
// "47482.36",
// "47482.36",
// "47416.57",
// "47436.1",
// "3.550717",
// 1640804940000,
// "168387.3"
// ],
// ]
//
candles = response
} else if IsTrue(GetValue(market, "swap")) {
var until interface{} = this.SafeIntegerProductN(params, []interface{}{"until", "endTime"}, 0.001)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "start", this.ParseToInt(Divide(since, 1000)))
}
if IsTrue(!IsEqual(until, nil)) {
params = this.Omit(params, []interface{}{"until"})
AddElementToObject(request, "end", until)
}
var priceType interface{} = this.SafeString(params, "price", "default")
params = this.Omit(params, "price")
var response interface{} = nil
if IsTrue(IsEqual(priceType, "default")) {
response = (<-this.ContractPublicGetKlineSymbol(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(priceType, "index")) {
response = (<-this.ContractPublicGetKlineIndexPriceSymbol(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(priceType, "mark")) {
response = (<-this.ContractPublicGetKlineFairPriceSymbol(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchOHLCV() not support this price type, [default, index, mark]")))
}
//
// {
// "success":true,
// "code":0,
// "data":{
// "time":[1634052300,1634052360,1634052420],
// "open":[3492.2,3491.3,3495.65],
// "close":[3491.3,3495.65,3495.2],
// "high":[3495.85,3496.55,3499.4],
// "low":[3491.15,3490.9,3494.2],
// "vol":[1740.0,351.0,314.0],
// "amount":[60793.623,12260.4885,10983.1375],
// }
// }
//
var data interface{} = this.SafeValue(response, "data")
candles = this.ConvertTradingViewToOHLCV(data, "time", "open", "high", "low", "close", "vol")
}
ch <- this.ParseOHLCVs(candles, market, timeframe, since, limit)
return nil
}()
return ch
}
func (this *mexc) ParseOHLCV(ohlcv interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
return []interface{}{this.SafeInteger(ohlcv, 0), this.SafeNumber(ohlcv, 1), this.SafeNumber(ohlcv, 2), this.SafeNumber(ohlcv, 3), this.SafeNumber(ohlcv, 4), this.SafeNumber(ohlcv, 5)}
}
/**
* @method
* @name mexc#fetchTickers
* @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#24hr-ticker-price-change-statistics
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-contract-trend-data
* @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 *mexc) 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
retRes19328 := (<-this.LoadMarkets())
PanicOnError(retRes19328)
var request interface{} = map[string]interface{} {}
var market interface{} = nil
var isSingularMarket interface{} = false
if IsTrue(!IsEqual(symbols, nil)) {
var length interface{} = GetArrayLength(symbols)
isSingularMarket = IsEqual(length, 1)
var firstSymbol interface{} = this.SafeString(symbols, 0)
market = this.Market(firstSymbol)
}
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchTickers", market, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
var tickers interface{} = nil
if IsTrue(isSingularMarket) {
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
if IsTrue(IsEqual(marketType, "spot")) {
tickers = (<-this.SpotPublicGetTicker24hr(this.Extend(request, query)))
PanicOnError(tickers)
} else if IsTrue(IsEqual(marketType, "swap")) {
response:= (<-this.ContractPublicGetTicker(this.Extend(request, query)))
PanicOnError(response)
//
// {
// "success":true,
// "code":0,
// "data":[
// {
// "symbol":"ETH_USDT",
// "lastPrice":3581.3,
// "bid1":3581.25,
// "ask1":3581.5,
// "volume24":4045530,
// "amount24":141331823.5755,
// "holdVol":5832946,
// "lower24Price":3413.4,
// "high24Price":3588.7,
// "riseFallRate":0.0275,
// "riseFallValue":95.95,
// "indexPrice":3580.7852,
// "fairPrice":3581.08,
// "fundingRate":0.000063,
// "maxBidPrice":3938.85,
// "minAskPrice":3222.7,
// "timestamp":1634162885016
// },
// ]
// }
//
tickers = this.SafeValue(response, "data", []interface{}{})
}
// when it's single symbol request, the returned structure is different (singular object) for both spot & swap, thus we need to wrap inside array
if IsTrue(isSingularMarket) {
tickers = []interface{}{tickers}
}
ch <- this.ParseTickers(tickers, symbols)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchTicker
* @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#24hr-ticker-price-change-statistics
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-contract-trend-data
* @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 *mexc) 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
retRes20228 := (<-this.LoadMarkets())
PanicOnError(retRes20228)
var market interface{} = this.Market(symbol)
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchTicker", market, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
var ticker interface{} = nil
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
if IsTrue(IsEqual(marketType, "spot")) {
ticker = (<-this.SpotPublicGetTicker24hr(this.Extend(request, query)))
PanicOnError(ticker)
} else if IsTrue(IsEqual(marketType, "swap")) {
response:= (<-this.ContractPublicGetTicker(this.Extend(request, query)))
PanicOnError(response)
//
// {
// "success":true,
// "code":0,
// "data":{
// "symbol":"ETH_USDT",
// "lastPrice":3581.3,
// "bid1":3581.25,
// "ask1":3581.5,
// "volume24":4045530,
// "amount24":141331823.5755,
// "holdVol":5832946,
// "lower24Price":3413.4,
// "high24Price":3588.7,
// "riseFallRate":0.0275,
// "riseFallValue":95.95,
// "indexPrice":3580.7852,
// "fairPrice":3581.08,
// "fundingRate":0.000063,
// "maxBidPrice":3938.85,
// "minAskPrice":3222.7,
// "timestamp":1634162885016
// }
// }
//
ticker = this.SafeValue(response, "data", map[string]interface{} {})
}
// when it's single symbol request, the returned structure is different (singular object) for both spot & swap, thus we need to wrap inside array
ch <- this.ParseTicker(ticker, market)
return nil
}()
return ch
}
func (this *mexc) ParseTicker(ticker interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(ticker, "symbol")
market = this.SafeMarket(marketId, market)
var timestamp interface{} = nil
var bid interface{} = nil
var ask interface{} = nil
var bidVolume interface{} = nil
var askVolume interface{} = nil
var baseVolume interface{} = nil
var quoteVolume interface{} = nil
var open interface{} = nil
var high interface{} = nil
var low interface{} = nil
var changePcnt interface{} = nil
var changeValue interface{} = nil
var prevClose interface{} = nil
var isSwap interface{} = this.SafeValue(market, "swap")
// if swap
if IsTrue(IsTrue(isSwap) || IsTrue((InOp(ticker, "timestamp")))) {
//
// {
// "symbol": "ETH_USDT",
// "lastPrice": 3581.3,
// "bid1": 3581.25,
// "ask1": 3581.5,
// "volume24": 4045530,
// "amount24": 141331823.5755,
// "holdVol": 5832946,
// "lower24Price": 3413.4,
// "high24Price": 3588.7,
// "riseFallRate": 0.0275,
// "riseFallValue": 95.95,
// "indexPrice": 3580.7852,
// "fairPrice": 3581.08,
// "fundingRate": 0.000063,
// "maxBidPrice": 3938.85,
// "minAskPrice": 3222.7,
// "timestamp": 1634162885016
// }
//
timestamp = this.SafeInteger(ticker, "timestamp")
bid = this.SafeString(ticker, "bid1")
ask = this.SafeString(ticker, "ask1")
baseVolume = this.SafeString(ticker, "volume24")
quoteVolume = this.SafeString(ticker, "amount24")
high = this.SafeString(ticker, "high24Price")
low = this.SafeString(ticker, "lower24Price")
changeValue = this.SafeString(ticker, "riseFallValue")
changePcnt = this.SafeString(ticker, "riseFallRate")
changePcnt = Precise.StringMul(changePcnt, "100")
} else {
//
// {
// "symbol": "BTCUSDT",
// "priceChange": "184.34",
// "priceChangePercent": "0.00400048",
// "prevClosePrice": "46079.37",
// "lastPrice": "46263.71",
// "lastQty": "",
// "bidPrice": "46260.38",
// "bidQty": "",
// "askPrice": "46260.41",
// "askQty": "",
// "openPrice": "46079.37",
// "highPrice": "47550.01",
// "lowPrice": "45555.5",
// "volume": "1732.461487",
// "quoteVolume": null,
// "openTime": 1641349500000,
// "closeTime": 1641349582808,
// "count": null
// }
//
timestamp = this.SafeInteger(ticker, "closeTime")
bid = this.SafeString(ticker, "bidPrice")
ask = this.SafeString(ticker, "askPrice")
bidVolume = this.SafeString(ticker, "bidQty")
askVolume = this.SafeString(ticker, "askQty")
if IsTrue(Precise.StringEq(bidVolume, "0")) {
bidVolume = nil
}
if IsTrue(Precise.StringEq(askVolume, "0")) {
askVolume = nil
}
baseVolume = this.SafeString(ticker, "volume")
quoteVolume = this.SafeString(ticker, "quoteVolume")
open = this.SafeString(ticker, "openPrice")
high = this.SafeString(ticker, "highPrice")
low = this.SafeString(ticker, "lowPrice")
prevClose = this.SafeString(ticker, "prevClosePrice")
changeValue = this.SafeString(ticker, "priceChange")
changePcnt = this.SafeString(ticker, "priceChangePercent")
changePcnt = Precise.StringMul(changePcnt, "100")
}
return this.SafeTicker(map[string]interface{} {
"symbol": GetValue(market, "symbol"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"open": open,
"high": high,
"low": low,
"close": this.SafeString(ticker, "lastPrice"),
"bid": bid,
"bidVolume": bidVolume,
"ask": ask,
"askVolume": askVolume,
"vwap": nil,
"previousClose": prevClose,
"change": changeValue,
"percentage": changePcnt,
"average": nil,
"baseVolume": baseVolume,
"quoteVolume": quoteVolume,
"info": ticker,
}, market)
}
/**
* @method
* @name mexc#fetchBidsAsks
* @description fetches the bid and ask price and volume for multiple markets
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#symbol-order-book-ticker
* @param {string[]|undefined} symbols unified symbols of the markets to fetch the bids and asks for, all markets 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 *mexc) FetchBidsAsks(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
retRes22138 := (<-this.LoadMarkets())
PanicOnError(retRes22138)
var market interface{} = nil
var isSingularMarket interface{} = false
if IsTrue(!IsEqual(symbols, nil)) {
var length interface{} = GetArrayLength(symbols)
isSingularMarket = IsEqual(length, 1)
market = this.Market(GetValue(symbols, 0))
}
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchBidsAsks", market, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
var tickers interface{} = nil
if IsTrue(IsEqual(marketType, "spot")) {
tickers = (<-this.SpotPublicGetTickerBookTicker(query))
PanicOnError(tickers)
} else if IsTrue(IsEqual(marketType, "swap")) {
panic(NotSupported(Add(Add(Add(this.Id, " fetchBidsAsks() is not available for "), marketType), " markets")))
}
// when it's single symbol request, the returned structure is different (singular object) for both spot & swap, thus we need to wrap inside array
if IsTrue(isSingularMarket) {
tickers = []interface{}{tickers}
}
ch <- this.ParseTickers(tickers, symbols)
return nil
}()
return ch
}
/**
* @method
* @name mexc#createMarketBuyOrderWithCost
* @description create a market buy order by providing the symbol and cost
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#new-order
* @param {string} symbol unified symbol of the market to create an order in
* @param {float} cost how much you want to trade in units of the quote currency
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) 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
retRes22578 := (<-this.LoadMarkets())
PanicOnError(retRes22578)
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "spot")) {
panic(NotSupported(Add(this.Id, " createMarketBuyOrderWithCost() supports spot orders only")))
}
AddElementToObject(params, "cost", cost)
retRes226315 := (<-this.CreateOrder(symbol, "market", "buy", 0, nil, params))
PanicOnError(retRes226315)
ch <- retRes226315
return nil
}()
return ch
}
/**
* @method
* @name mexc#createMarketSellOrderWithCost
* @description create a market sell order by providing the symbol and cost
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#new-order
* @param {string} symbol unified symbol of the market to create an order in
* @param {float} cost how much you want to trade in units of the quote currency
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) CreateMarketSellOrderWithCost(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
retRes22778 := (<-this.LoadMarkets())
PanicOnError(retRes22778)
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "spot")) {
panic(NotSupported(Add(this.Id, " createMarketBuyOrderWithCost() supports spot orders only")))
}
AddElementToObject(params, "cost", cost)
retRes228315 := (<-this.CreateOrder(symbol, "market", "sell", 0, nil, params))
PanicOnError(retRes228315)
ch <- retRes228315
return nil
}()
return ch
}
/**
* @method
* @name mexc#createOrder
* @description create a trade order
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#new-order
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#order-under-maintenance
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#trigger-order-under-maintenance
* @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 currency you want to trade in units of 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 {string} [params.marginMode] only 'isolated' is supported for spot-margin trading
* @param {float} [params.triggerPrice] The price at which a trigger order is triggered at
* @param {bool} [params.postOnly] if true, the order will only be posted if it will be a maker order
* @param {bool} [params.reduceOnly] *contract only* indicates if this order is to reduce the size of a position
* @param {bool} [params.hedged] *swap only* true for hedged mode, false for one way mode, default is false
* @param {string} [params.timeInForce] 'IOC' or 'FOK', default is 'GTC'
* EXCHANGE SPECIFIC PARAMETERS
* @param {int} [params.leverage] *contract only* leverage is necessary on isolated margin
* @param {long} [params.positionId] *contract only* it is recommended to fill in this parameter when closing a position
* @param {string} [params.externalOid] *contract only* external order ID
* @param {int} [params.positionMode] *contract only* 1:hedge, 2:one-way, default: the user's current config
* @param {boolean} [params.test] *spot only* whether to use the test endpoint or not, default is false
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) 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
retRes23148 := (<-this.LoadMarkets())
PanicOnError(retRes23148)
var market interface{} = this.Market(symbol)
marginModequeryVariable := this.HandleMarginModeAndParams("createOrder", params);
marginMode := GetValue(marginModequeryVariable,0);
query := GetValue(marginModequeryVariable,1)
if IsTrue(GetValue(market, "spot")) {
retRes231819 := (<-this.CreateSpotOrder(market, typeVar, side, amount, price, marginMode, query))
PanicOnError(retRes231819)
ch <- retRes231819
return nil
} else {
retRes232019 := (<-this.CreateSwapOrder(market, typeVar, side, amount, price, marginMode, query))
PanicOnError(retRes232019)
ch <- retRes232019
return nil
}
return nil
}()
return ch
}
func (this *mexc) CreateSpotOrderRequest(market interface{}, typeVar interface{}, side interface{}, amount interface{}, optionalArgs ...interface{}) interface{} {
price := GetArg(optionalArgs, 0, nil)
_ = price
marginMode := GetArg(optionalArgs, 1, nil)
_ = marginMode
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
var symbol interface{} = GetValue(market, "symbol")
var orderSide interface{} = ToUpper(side)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"side": orderSide,
"type": ToUpper(typeVar),
}
if IsTrue(IsEqual(typeVar, "market")) {
var cost interface{} = this.SafeNumber2(params, "cost", "quoteOrderQty")
params = this.Omit(params, "cost")
if IsTrue(!IsEqual(cost, nil)) {
amount = cost
AddElementToObject(request, "quoteOrderQty", this.CostToPrecision(symbol, amount))
} else {
if IsTrue(IsEqual(price, nil)) {
AddElementToObject(request, "quantity", this.AmountToPrecision(symbol, amount))
} else {
var amountString interface{} = this.NumberToString(amount)
var priceString interface{} = this.NumberToString(price)
var quoteAmount interface{} = Precise.StringMul(amountString, priceString)
amount = quoteAmount
AddElementToObject(request, "quoteOrderQty", this.CostToPrecision(symbol, amount))
}
}
} else {
AddElementToObject(request, "quantity", this.AmountToPrecision(symbol, amount))
}
if IsTrue(!IsEqual(price, nil)) {
AddElementToObject(request, "price", this.PriceToPrecision(symbol, price))
}
var clientOrderId interface{} = this.SafeString(params, "clientOrderId")
if IsTrue(!IsEqual(clientOrderId, nil)) {
AddElementToObject(request, "newClientOrderId", clientOrderId)
params = this.Omit(params, []interface{}{"type", "clientOrderId"})
}
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(!IsEqual(marginMode, "isolated")) {
panic(BadRequest(Add(Add(Add(this.Id, " createOrder() does not support marginMode "), marginMode), " for spot-margin trading")))
}
}
var postOnly interface{} = nil
postOnlyparamsVariable := this.HandlePostOnly(IsEqual(typeVar, "market"), IsEqual(typeVar, "LIMIT_MAKER"), params);
postOnly = GetValue(postOnlyparamsVariable,0);
params = GetValue(postOnlyparamsVariable,1)
if IsTrue(postOnly) {
AddElementToObject(request, "type", "LIMIT_MAKER")
}
var tif interface{} = this.SafeString(params, "timeInForce")
if IsTrue(!IsEqual(tif, nil)) {
params = this.Omit(params, "timeInForce")
if IsTrue(IsEqual(tif, "IOC")) {
AddElementToObject(request, "type", "IMMEDIATE_OR_CANCEL")
} else if IsTrue(IsEqual(tif, "FOK")) {
AddElementToObject(request, "type", "FILL_OR_KILL")
}
}
return this.Extend(request, params)
}
/**
* @ignore
* @method
* @name mexc#createSpotOrder
* @description create a trade order
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#new-order
* @param {string} market 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 currency you want to trade in units of 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 {string} [marginMode] only 'isolated' is supported for spot-margin trading
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {bool} [params.postOnly] if true, the order will only be posted if it will be a maker order
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) CreateSpotOrder(market 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
marginMode := GetArg(optionalArgs, 1, nil)
_ = marginMode
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
retRes23998 := (<-this.LoadMarkets())
PanicOnError(retRes23998)
var test interface{} = this.SafeBool(params, "test", false)
params = this.Omit(params, "test")
var request interface{} = this.CreateSpotOrderRequest(market, typeVar, side, amount, price, marginMode, params)
var response interface{} = nil
if IsTrue(test) {
response = (<-this.SpotPrivatePostOrderTest(request))
PanicOnError(response)
} else {
response = (<-this.SpotPrivatePostOrder(request))
PanicOnError(response)
}
//
// spot
//
// {
// "symbol": "BTCUSDT",
// "orderId": "123738410679123456",
// "orderListId": -1
// }
//
// margin
//
// {
// "symbol": "BTCUSDT",
// "orderId": "762634301354414080",
// "clientOrderId": null,
// "isIsolated": true,
// "transactTime": 1661992652132
// }
//
var order interface{} = this.ParseOrder(response, market)
AddElementToObject(order, "side", side)
AddElementToObject(order, "type", typeVar)
if IsTrue(IsEqual(this.SafeString(order, "price"), nil)) {
AddElementToObject(order, "price", price)
}
if IsTrue(IsEqual(this.SafeString(order, "amount"), nil)) {
AddElementToObject(order, "amount", amount)
}
ch <- order
return nil
}()
return ch
}
/**
* @ignore
* @method
* @name mexc#createSwapOrder
* @description create a trade order
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#new-order
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#order-under-maintenance
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#trigger-order-under-maintenance
* @param {string} market 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 currency you want to trade in units of 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 {string} [marginMode] only 'isolated' is supported for spot-margin trading
* @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 {bool} [params.postOnly] if true, the order will only be posted if it will be a maker order
* @param {bool} [params.reduceOnly] indicates if this order is to reduce the size of a position
* @param {bool} [params.hedged] *swap only* true for hedged mode, false for one way mode, default is false
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {int} [params.leverage] leverage is necessary on isolated margin
* @param {long} [params.positionId] it is recommended to fill in this parameter when closing a position
* @param {string} [params.externalOid] external order ID
* @param {int} [params.positionMode] 1:hedge, 2:one-way, default: the user's current config
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) CreateSwapOrder(market 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
marginMode := GetArg(optionalArgs, 1, nil)
_ = marginMode
params := GetArg(optionalArgs, 2, map[string]interface{} {})
_ = params
retRes24688 := (<-this.LoadMarkets())
PanicOnError(retRes24688)
var symbol interface{} = GetValue(market, "symbol")
var unavailableContracts interface{} = this.SafeValue(this.Options, "unavailableContracts", map[string]interface{} {})
var isContractUnavaiable interface{} = this.SafeBool(unavailableContracts, symbol, false)
if IsTrue(isContractUnavaiable) {
panic(NotSupported(Add(Add(this.Id, " createSwapOrder() does not support yet this symbol:"), symbol)))
}
var openType interface{} = nil
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(IsEqual(marginMode, "cross")) {
openType = 2
} else if IsTrue(IsEqual(marginMode, "isolated")) {
openType = 1
} else {
panic(ArgumentsRequired(Add(this.Id, " createSwapOrder() marginMode parameter should be either \"cross\" or \"isolated\"")))
}
} else {
openType = this.SafeInteger(params, "openType", 2) // defaulting to cross margin
}
if IsTrue(IsTrue(IsTrue(IsTrue(IsTrue(IsTrue(IsTrue(IsTrue((!IsEqual(typeVar, "limit"))) && IsTrue((!IsEqual(typeVar, "market")))) && IsTrue((!IsEqual(typeVar, 1)))) && IsTrue((!IsEqual(typeVar, 2)))) && IsTrue((!IsEqual(typeVar, 3)))) && IsTrue((!IsEqual(typeVar, 4)))) && IsTrue((!IsEqual(typeVar, 5)))) && IsTrue((!IsEqual(typeVar, 6)))) {
panic(InvalidOrder(Add(this.Id, " createSwapOrder() order type must either limit, market, or 1 for limit orders, 2 for post-only orders, 3 for IOC orders, 4 for FOK orders, 5 for market orders or 6 to convert market price to current price")))
}
var postOnly interface{} = nil
postOnlyparamsVariable := this.HandlePostOnly(IsEqual(typeVar, "market"), IsEqual(typeVar, 2), params);
postOnly = GetValue(postOnlyparamsVariable,0);
params = GetValue(postOnlyparamsVariable,1)
if IsTrue(postOnly) {
typeVar = 2
} else if IsTrue(IsEqual(typeVar, "limit")) {
typeVar = 1
} else if IsTrue(IsEqual(typeVar, "market")) {
typeVar = 6
}
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
"vol": ParseFloat(this.AmountToPrecision(symbol, amount)),
"type": typeVar,
"openType": openType,
}
if IsTrue(IsTrue(IsTrue((!IsEqual(typeVar, 5))) && IsTrue((!IsEqual(typeVar, 6)))) && IsTrue((!IsEqual(typeVar, "market")))) {
AddElementToObject(request, "price", ParseFloat(this.PriceToPrecision(symbol, price)))
}
if IsTrue(IsEqual(openType, 1)) {
var leverage interface{} = this.SafeInteger(params, "leverage")
if IsTrue(IsEqual(leverage, nil)) {
panic(ArgumentsRequired(Add(this.Id, " createSwapOrder() requires a leverage parameter for isolated margin orders")))
}
}
var reduceOnly interface{} = this.SafeBool(params, "reduceOnly", false)
var hedged interface{} = this.SafeBool(params, "hedged", false)
var sideInteger interface{} = nil
if IsTrue(hedged) {
if IsTrue(reduceOnly) {
params = this.Omit(params, "reduceOnly") // hedged mode does not accept this parameter
side = Ternary(IsTrue((IsEqual(side, "buy"))), "sell", "buy")
}
sideInteger = Ternary(IsTrue((IsEqual(side, "buy"))), 1, 3)
AddElementToObject(request, "positionMode", 1)
} else {
if IsTrue(reduceOnly) {
sideInteger = Ternary(IsTrue((IsEqual(side, "buy"))), 2, 4)
} else {
sideInteger = Ternary(IsTrue((IsEqual(side, "buy"))), 1, 3)
}
}
AddElementToObject(request, "side", sideInteger)
var clientOrderId interface{} = this.SafeString2(params, "clientOrderId", "externalOid")
if IsTrue(!IsEqual(clientOrderId, nil)) {
AddElementToObject(request, "externalOid", clientOrderId)
}
var triggerPrice interface{} = this.SafeNumber2(params, "triggerPrice", "stopPrice")
params = this.Omit(params, []interface{}{"clientOrderId", "externalOid", "postOnly", "stopPrice", "triggerPrice", "hedged"})
var response interface{} = nil
if IsTrue(triggerPrice) {
AddElementToObject(request, "triggerPrice", this.PriceToPrecision(symbol, triggerPrice))
AddElementToObject(request, "triggerType", this.SafeInteger(params, "triggerType", 1))
AddElementToObject(request, "executeCycle", this.SafeInteger(params, "executeCycle", 1))
AddElementToObject(request, "trend", this.SafeInteger(params, "trend", 1))
AddElementToObject(request, "orderType", this.SafeInteger(params, "orderType", 1))
response = (<-this.ContractPrivatePostPlanorderPlace(this.Extend(request, params)))
PanicOnError(response)
} else {
response = (<-this.ContractPrivatePostOrderSubmit(this.Extend(request, params)))
PanicOnError(response)
}
//
// Swap
// {"code":200,"data":"2ff3163e8617443cb9c6fc19d42b1ca4"}
//
// Trigger
// {"success":true,"code":0,"data":259208506303929856}
//
var data interface{} = this.SafeString(response, "data")
ch <- this.SafeOrder(map[string]interface{} {
"id": data,
}, market)
return nil
}()
return ch
}
/**
* @method
* @name mexc#createOrders
* @description *spot only* *all orders must have the same symbol* create a list of trade orders
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#batch-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 api endpoint
* @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) 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
retRes25908 := (<-this.LoadMarkets())
PanicOnError(retRes25908)
var ordersRequests interface{} = []interface{}{}
var symbol interface{} = nil
for i := 0; IsLessThan(i, GetArrayLength(orders)); i++ {
var rawOrder interface{} = GetValue(orders, i)
var marketId interface{} = this.SafeString(rawOrder, "symbol")
var market interface{} = this.Market(marketId)
if !IsTrue(GetValue(market, "spot")) {
panic(NotSupported(Add(this.Id, " createOrders() is only supported for spot markets")))
}
if IsTrue(IsEqual(symbol, nil)) {
symbol = marketId
} else {
if IsTrue(!IsEqual(symbol, marketId)) {
panic(BadRequest(Add(this.Id, " createOrders() requires all orders to have the same symbol")))
}
}
var typeVar interface{} = this.SafeString(rawOrder, "type")
var side interface{} = this.SafeString(rawOrder, "side")
var amount interface{} = this.SafeValue(rawOrder, "amount")
var price interface{} = this.SafeValue(rawOrder, "price")
var orderParams interface{} = this.SafeValue(rawOrder, "params", map[string]interface{} {})
var marginMode interface{} = nil
marginModeparamsVariable := this.HandleMarginModeAndParams("createOrder", params);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
var orderRequest interface{} = this.CreateSpotOrderRequest(market, typeVar, side, amount, price, marginMode, orderParams)
AppendToArray(&ordersRequests,orderRequest)
}
var request interface{} = map[string]interface{} {
"batchOrders": this.Json(ordersRequests),
}
response:= (<-this.SpotPrivatePostBatchOrders(request))
PanicOnError(response)
//
// [
// {
// "symbol": "BTCUSDT",
// "orderId": "1196315350023612316",
// "newClientOrderId": "hio8279hbdsds",
// "orderListId": -1
// },
// {
// "newClientOrderId": "123456",
// "msg": "The minimum transaction volume cannot be less than:0.5USDT",
// "code": 30002
// },
// {
// "symbol": "BTCUSDT",
// "orderId": "1196315350023612318",
// "orderListId": -1
// }
// ]
//
ch <- this.ParseOrders(response)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchOrder
* @description fetches information on an order made by the user
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#query-order
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#query-the-order-based-on-the-order-number
* @param {string} id order id
* @param {string} symbol unified symbol of the market the order was made in
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.marginMode] only 'isolated' is supported, for spot-margin trading
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) FetchOrder(id interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchOrder() requires a symbol argument")))
}
retRes26608 := (<-this.LoadMarkets())
PanicOnError(retRes26608)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
var data interface{} = nil
if IsTrue(GetValue(market, "spot")) {
var clientOrderId interface{} = this.SafeString(params, "clientOrderId")
if IsTrue(!IsEqual(clientOrderId, nil)) {
params = this.Omit(params, "clientOrderId")
AddElementToObject(request, "origClientOrderId", clientOrderId)
} else {
AddElementToObject(request, "orderId", id)
}
marginModequeryVariable := this.HandleMarginModeAndParams("fetchOrder", params);
marginMode := GetValue(marginModequeryVariable,0);
query := GetValue(marginModequeryVariable,1)
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(!IsEqual(marginMode, "isolated")) {
panic(BadRequest(Add(Add(Add(this.Id, " fetchOrder() does not support marginMode "), marginMode), " for spot-margin trading")))
}
data = (<-this.SpotPrivateGetMarginOrder(this.Extend(request, query)))
PanicOnError(data)
} else {
data = (<-this.SpotPrivateGetOrder(this.Extend(request, query)))
PanicOnError(data)
}
} else if IsTrue(GetValue(market, "swap")) {
AddElementToObject(request, "order_id", id)
response:= (<-this.ContractPrivateGetOrderGetOrderId(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "code": "0",
// "data": {
// "orderId": "264995729269765120",
// "symbol": "STEPN_USDT",
// "positionId": "0",
// "price": "2.2",
// "vol": "15",
// "leverage": "20",
// "side": "1",
// "category": "1",
// "orderType": "1",
// "dealAvgPrice": "0",
// "dealVol": "0",
// "orderMargin": "2.2528",
// "takerFee": "0",
// "makerFee": "0",
// "profit": "0",
// "feeCurrency": "USDT",
// "openType": "1",
// "state": "2",
// "externalOid": "_m_0e9520c256744d64b942985189026d20",
// "errorCode": "0",
// "usedMargin": "0",
// "createTime": "1648850305236",
// "updateTime": "1648850305245",
// "positionMode": "1"
// }
// }
//
data = this.SafeValue(response, "data")
}
ch <- this.ParseOrder(data, market)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchOrders
* @description fetches information on multiple orders made by the user
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#all-orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-all-of-the-user-39-s-historical-orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#gets-the-trigger-order-list
* @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 {int} [params.until] the latest time in ms to fetch orders for
* @param {string} [params.marginMode] only 'isolated' is supported, for spot-margin trading
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) FetchOrders(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
retRes27838 := (<-this.LoadMarkets())
PanicOnError(retRes27838)
var request interface{} = map[string]interface{} {}
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
var until interface{} = this.SafeInteger(params, "until")
params = this.Omit(params, "until")
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchOrders", market, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchOrders() requires a symbol argument for spot market")))
}
marginModequeryInnerVariable := this.HandleMarginModeAndParams("fetchOrders", params);
marginMode := GetValue(marginModequeryInnerVariable,0);
queryInner := GetValue(marginModequeryInnerVariable,1)
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(until, nil)) {
AddElementToObject(request, "endTime", until)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var response interface{} = nil
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(!IsEqual(marginMode, "isolated")) {
panic(BadRequest(Add(Add(Add(this.Id, " fetchOrders() does not support marginMode "), marginMode), " for spot-margin trading")))
}
response = (<-this.SpotPrivateGetMarginAllOrders(this.Extend(request, queryInner)))
PanicOnError(response)
} else {
response = (<-this.SpotPrivateGetAllOrders(this.Extend(request, queryInner)))
PanicOnError(response)
}
//
// spot
//
// [
// {
// "symbol": "BTCUSDT",
// "orderId": "133949373632483328",
// "orderListId": "-1",
// "clientOrderId": null,
// "price": "45000",
// "origQty": "0.0002",
// "executedQty": "0",
// "cummulativeQuoteQty": "0",
// "status": "NEW",
// "timeInForce": null,
// "type": "LIMIT",
// "side": "SELL",
// "stopPrice": null,
// "icebergQty": null,
// "time": "1647718255000",
// "updateTime": "1647718255000",
// "isWorking": true,
// "origQuoteOrderQty": "9"
// },
// ]
//
// margin
//
// [
// {
// "symbol": "BTCUSDT",
// "orderId": "763307297891028992",
// "orderListId": "-1",
// "clientOrderId": null,
// "price": "18000",
// "origQty": "0.0014",
// "executedQty": "0",
// "cummulativeQuoteQty": "0",
// "status": "NEW",
// "type": "LIMIT",
// "side": "BUY",
// "isIsolated": true,
// "isWorking": true,
// "time": 1662153107000,
// "updateTime": 1662153107000
// }
// ]
//
ch <- this.ParseOrders(response, market, since, limit)
return nil
} else {
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "start_time", since)
var end interface{} = this.SafeInteger(params, "end_time", until)
if IsTrue(IsEqual(end, nil)) {
AddElementToObject(request, "end_time", this.Sum(since, GetValue(this.Options, "maxTimeTillEnd")))
} else {
if IsTrue(IsGreaterThan((Subtract(end, since)), GetValue(this.Options, "maxTimeTillEnd"))) {
panic(BadRequest(Add(this.Id, " end is invalid, i.e. exceeds allowed 90 days.")))
} else {
AddElementToObject(request, "end_time", until)
}
}
} else if IsTrue(!IsEqual(until, nil)) {
AddElementToObject(request, "start_time", this.Sum(until, Multiply(GetValue(this.Options, "maxTimeTillEnd"), OpNeg(1))))
AddElementToObject(request, "end_time", until)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "page_size", limit)
}
var method interface{} = this.SafeString(this.Options, "fetchOrders", "contractPrivateGetOrderListHistoryOrders")
method = this.SafeString(query, "method", method)
var ordersOfRegular interface{} = []interface{}{}
var ordersOfTrigger interface{} = []interface{}{}
if IsTrue(IsEqual(method, "contractPrivateGetOrderListHistoryOrders")) {
response:= (<-this.ContractPrivateGetOrderListHistoryOrders(this.Extend(request, query)))
PanicOnError(response)
//
// {
// "success": true,
// "code": "0",
// "data": [
// {
// "orderId": "265230764677709315",
// "symbol": "STEPN_USDT",
// "positionId": "0",
// "price": "2.1",
// "vol": "102",
// "leverage": "20",
// "side": "1",
// "category": "1",
// "orderType": "1",
// "dealAvgPrice": "0",
// "dealVol": "0",
// "orderMargin": "10.96704",
// "takerFee": "0",
// "makerFee": "0",
// "profit": "0",
// "feeCurrency": "USDT",
// "openType": "1",
// "state": "2",
// "externalOid": "_m_7e42f8df6b324c869e4e200397e2b00f",
// "errorCode": "0",
// "usedMargin": "0",
// "createTime": "1648906342000",
// "updateTime": "1648906342000",
// "positionMode": "1"
// },
// ]
// }
//
ordersOfRegular = this.SafeValue(response, "data")
} else {
// the Planorder endpoints work not only for stop-market orders, but also for stop-limit orders that were supposed to have a separate endpoint
response:= (<-this.ContractPrivateGetPlanorderListOrders(this.Extend(request, query)))
PanicOnError(response)
//
// {
// "success": true,
// "code": "0",
// "data": [
// {
// "symbol": "STEPN_USDT",
// "leverage": "20",
// "side": "1",
// "vol": "13",
// "openType": "1",
// "state": "1",
// "orderType": "1",
// "errorCode": "0",
// "createTime": "1648984276000",
// "updateTime": "1648984276000",
// "id": "265557643326564352",
// "triggerType": "1",
// "triggerPrice": "3",
// "price": "2.9", // not present in stop-market, but in stop-limit order
// "executeCycle": "87600",
// "trend": "1",
// },
// ]
// }
//
ordersOfTrigger = this.SafeValue(response, "data")
}
var merged interface{} = this.ArrayConcat(ordersOfTrigger, ordersOfRegular)
ch <- this.ParseOrders(merged, market, since, limit, params)
return nil
}
return nil
}()
return ch
}
func (this *mexc) FetchOrdersByIds(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
retRes29638 := (<-this.LoadMarkets())
PanicOnError(retRes29638)
var request interface{} = map[string]interface{} {}
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchOrdersByIds", market, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
if IsTrue(IsEqual(marketType, "spot")) {
panic(BadRequest(Add(Add(this.Id, " fetchOrdersByIds() is not supported for "), marketType)))
} else {
AddElementToObject(request, "order_ids", Join(ids, ","))
response:= (<-this.ContractPrivateGetOrderBatchQuery(this.Extend(request, query)))
PanicOnError(response)
//
// {
// "success": true,
// "code": "0",
// "data": [
// {
// "orderId": "265230764677709315",
// "symbol": "STEPN_USDT",
// "positionId": "0",
// "price": "2.1",
// "vol": "102",
// "leverage": "20",
// "side": "1",
// "category": "1",
// "orderType": "1",
// "dealAvgPrice": "0",
// "dealVol": "0",
// "orderMargin": "10.96704",
// "takerFee": "0",
// "makerFee": "0",
// "profit": "0",
// "feeCurrency": "USDT",
// "openType": "1",
// "state": "2",
// "externalOid": "_m_7e42f8df6b324c869e4e200397e2b00f",
// "errorCode": "0",
// "usedMargin": "0",
// "createTime": "1648906342000",
// "updateTime": "1648906342000",
// "positionMode": "1"
// }
// ]
// }
//
var data interface{} = this.SafeList(response, "data")
ch <- this.ParseOrders(data, market)
return nil
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchOpenOrders
* @description fetch all unfilled currently open orders
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#current-open-orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-all-of-the-user-39-s-historical-orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#gets-the-trigger-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 {string} [params.marginMode] only 'isolated' is supported, for spot-margin trading
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) 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
retRes30308 := (<-this.LoadMarkets())
PanicOnError(retRes30308)
var request interface{} = map[string]interface{} {}
var market interface{} = nil
var marketType interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
}
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchOpenOrders", market, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchOpenOrders() requires a symbol argument for spot market")))
}
AddElementToObject(request, "symbol", GetValue(market, "id"))
marginModequeryVariable := this.HandleMarginModeAndParams("fetchOpenOrders", params);
marginMode := GetValue(marginModequeryVariable,0);
query := GetValue(marginModequeryVariable,1)
var response interface{} = nil
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(!IsEqual(marginMode, "isolated")) {
panic(BadRequest(Add(Add(Add(this.Id, " fetchOpenOrders() does not support marginMode "), marginMode), " for spot-margin trading")))
}
response = (<-this.SpotPrivateGetMarginOpenOrders(this.Extend(request, query)))
PanicOnError(response)
} else {
response = (<-this.SpotPrivateGetOpenOrders(this.Extend(request, query)))
PanicOnError(response)
}
//
// spot
//
// [
// {
// "symbol": "BTCUSDT",
// "orderId": "133949373632483328",
// "orderListId": "-1",
// "clientOrderId": "",
// "price": "45000",
// "origQty": "0.0002",
// "executedQty": "0",
// "cummulativeQuoteQty": "0",
// "status": "NEW",
// "timeInForce": null,
// "type": "LIMIT",
// "side": "SELL",
// "stopPrice": null,
// "icebergQty": null,
// "time": "1647718255199",
// "updateTime": null,
// "isWorking": true,
// "origQuoteOrderQty": "9"
// }
// ]
//
// margin
//
// [
// {
// "symbol": "BTCUSDT",
// "orderId": "764547676405633024",
// "orderListId": "-1",
// "clientOrderId": null,
// "price": "18000",
// "origQty": "0.0013",
// "executedQty": "0",
// "cummulativeQuoteQty": "0",
// "status": "NEW",
// "type": "LIMIT",
// "side": "BUY",
// "isIsolated": true,
// "isWorking": true,
// "time": 1662448836000,
// "updateTime": 1662448836000
// }
// ]
//
ch <- this.ParseOrders(response, market, since, limit)
return nil
} else {
retRes310419 := (<-this.FetchOrdersByState(2, symbol, since, limit, params))
PanicOnError(retRes310419)
// TO_DO: another possible way is through: open_orders/{symbol}, but as they have same ratelimits, and less granularity, i think historical orders are more convenient, as it supports more params (however, theoretically, open-orders endpoint might be sligthly fast)
ch <- retRes310419
return nil
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchClosedOrders
* @description fetches information on multiple closed orders made by the user
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#all-orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-all-of-the-user-39-s-historical-orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#gets-the-trigger-order-list
* @param {string} symbol unified market symbol of the market orders were made in
* @param {int} [since] the earliest time in ms to fetch orders for
* @param {int} [limit] the maximum number of order structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) 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
retRes312215 := (<-this.FetchOrdersByState(3, symbol, since, limit, params))
PanicOnError(retRes312215)
ch <- retRes312215
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchCanceledOrders
* @description fetches information on multiple canceled orders made by the user
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#all-orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-all-of-the-user-39-s-historical-orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#gets-the-trigger-order-list
* @param {string} symbol unified market symbol of the market orders were made in
* @param {int} [since] timestamp in ms of the earliest order, default is undefined
* @param {int} [limit] max number of orders to return, default is undefined
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) FetchCanceledOrders(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
retRes313915 := (<-this.FetchOrdersByState(4, symbol, since, limit, params))
PanicOnError(retRes313915)
ch <- retRes313915
return nil
}()
return ch
}
func (this *mexc) FetchOrdersByState(state 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
retRes31438 := (<-this.LoadMarkets())
PanicOnError(retRes31438)
var request interface{} = map[string]interface{} {}
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
}
marketTypeVariable := this.HandleMarketTypeAndParams("fetchOrdersByState", market, params);
marketType := GetValue(marketTypeVariable,0)
if IsTrue(IsEqual(marketType, "spot")) {
panic(NotSupported(Add(Add(this.Id, " fetchOrdersByState() is not supported for "), marketType)))
} else {
AddElementToObject(request, "states", state)
retRes315419 := (<-this.FetchOrders(symbol, since, limit, this.Extend(request, params)))
PanicOnError(retRes315419)
ch <- retRes315419
return nil
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#cancelOrder
* @description cancels an open order
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#cancel-order
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#cancel-the-order-under-maintenance
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#cancel-the-stop-limit-trigger-order-under-maintenance
* @param {string} id order id
* @param {string} symbol unified symbol of the market the order was made in
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.marginMode] only 'isolated' is supported for spot-margin trading
* @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) 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
retRes31728 := (<-this.LoadMarkets())
PanicOnError(retRes31728)
var request interface{} = map[string]interface{} {}
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
var marketType interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("cancelOrder", market, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
marginModequeryVariable := this.HandleMarginModeAndParams("cancelOrder", params);
marginMode := GetValue(marginModequeryVariable,0);
query := GetValue(marginModequeryVariable,1)
var data interface{} = nil
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " cancelOrder() requires a symbol argument")))
}
var requestInner interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
var clientOrderId interface{} = this.SafeString(params, "clientOrderId")
if IsTrue(!IsEqual(clientOrderId, nil)) {
params = this.Omit(query, "clientOrderId")
AddElementToObject(requestInner, "origClientOrderId", clientOrderId)
} else {
AddElementToObject(requestInner, "orderId", id)
}
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(!IsEqual(marginMode, "isolated")) {
panic(BadRequest(Add(Add(Add(this.Id, " cancelOrder() does not support marginMode "), marginMode), " for spot-margin trading")))
}
data = (<-this.SpotPrivateDeleteMarginOrder(this.Extend(requestInner, query)))
PanicOnError(data)
} else {
data = (<-this.SpotPrivateDeleteOrder(this.Extend(requestInner, query)))
PanicOnError(data)
}
} else {
// TODO: PlanorderCancel endpoint has bug atm. waiting for fix.
var method interface{} = this.SafeString(this.Options, "cancelOrder", "contractPrivatePostOrderCancel") // contractPrivatePostOrderCancel, contractPrivatePostPlanorderCancel
method = this.SafeString(query, "method", method)
var response interface{} = nil
if IsTrue(IsEqual(method, "contractPrivatePostOrderCancel")) {
response = (<-this.ContractPrivatePostOrderCancel([]interface{}{id}))
PanicOnError(response) // the request cannot be changed or extended. This is the only way to send.
} else if IsTrue(IsEqual(method, "contractPrivatePostPlanorderCancel")) {
response = (<-this.ContractPrivatePostPlanorderCancel([]interface{}{id}))
PanicOnError(response) // the request cannot be changed or extended. This is the only way to send.
} else {
panic(NotSupported(Add(this.Id, " cancelOrder() not support this method")))
}
//
// {
// "success": true,
// "code": "0",
// "data": [
// {
// "orderId": "264995729269765120",
// "errorCode": "0", // if already canceled: "2041"; if doesn't exist: "2040"
// "errorMsg": "success", // if already canceled: "order state cannot be cancelled"; if doesn't exist: "order not exist"
// }
// ]
// }
//
data = this.SafeValue(response, "data")
var order interface{} = this.SafeValue(data, 0)
var errorMsg interface{} = this.SafeValue(order, "errorMsg", "")
if IsTrue(!IsEqual(errorMsg, "success")) {
panic(InvalidOrder(Add(Add(Add(Add(this.Id, " cancelOrder() the order with id "), id), " cannot be cancelled: "), errorMsg)))
}
}
ch <- this.ParseOrder(data, market)
return nil
}()
return ch
}
/**
* @method
* @name mexc#cancelOrders
* @description cancel multiple orders
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#cancel-the-order-under-maintenance
* @param {string[]} ids order ids
* @param {string} symbol unified market symbol, default is undefined
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) 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
retRes32858 := (<-this.LoadMarkets())
PanicOnError(retRes32858)
var market interface{} = Ternary(IsTrue((!IsEqual(symbol, nil))), this.Market(symbol), nil)
marketTypeVariable := this.HandleMarketTypeAndParams("cancelOrders", market, params);
marketType := GetValue(marketTypeVariable,0)
if IsTrue(IsEqual(marketType, "spot")) {
panic(BadRequest(Add(Add(this.Id, " cancelOrders() is not supported for "), marketType)))
} else {
response:= (<-this.ContractPrivatePostOrderCancel(ids))
PanicOnError(response) // the request cannot be changed or extended. The only way to send.
//
// {
// "success": true,
// "code": "0",
// "data": [
// {
// "orderId": "264995729269765120",
// "errorCode": "0", // if already canceled: "2041"
// "errorMsg": "success", // if already canceled: "order state cannot be cancelled"
// },
// ]
// }
//
var data interface{} = this.SafeList(response, "data")
ch <- this.ParseOrders(data, market)
return nil
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#cancelAllOrders
* @description cancel all open orders
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#cancel-all-open-orders-on-a-symbol
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#cancel-all-orders-under-a-contract-under-maintenance
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#cancel-all-trigger-orders-under-maintenance
* @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 {string} [params.marginMode] only 'isolated' is supported for spot-margin trading
* @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
*/
func (this *mexc) 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
retRes33238 := (<-this.LoadMarkets())
PanicOnError(retRes33238)
var market interface{} = Ternary(IsTrue((!IsEqual(symbol, nil))), this.Market(symbol), nil)
var request interface{} = map[string]interface{} {}
var marketType interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("cancelAllOrders", market, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
marginModequeryVariable := this.HandleMarginModeAndParams("cancelAllOrders", params);
marginMode := GetValue(marginModequeryVariable,0);
query := GetValue(marginModequeryVariable,1)
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " cancelAllOrders() requires a symbol argument on spot")))
}
AddElementToObject(request, "symbol", GetValue(market, "id"))
var response interface{} = nil
if IsTrue(!IsEqual(marginMode, nil)) {
if IsTrue(!IsEqual(marginMode, "isolated")) {
panic(BadRequest(Add(Add(Add(this.Id, " cancelAllOrders() does not support marginMode "), marginMode), " for spot-margin trading")))
}
response = (<-this.SpotPrivateDeleteMarginOpenOrders(this.Extend(request, query)))
PanicOnError(response)
} else {
response = (<-this.SpotPrivateDeleteOpenOrders(this.Extend(request, query)))
PanicOnError(response)
}
//
// spot
//
// [
// {
// "symbol": "BTCUSDT",
// "orderId": "133926492139692032",
// "price": "30000",
// "origQty": "0.0002",
// "type": "LIMIT",
// "side": "BUY"
// },
// ]
//
// margin
//
// [
// {
// "symbol": "BTCUSDT",
// "orderId": "762640232574226432",
// "orderListId": "-1",
// "clientOrderId": null,
// "price": "18000",
// "origQty": "0.00147",
// "executedQty": "0",
// "cummulativeQuoteQty": "0",
// "status": "NEW",
// "type": "LIMIT",
// "side": "BUY",
// "isIsolated": true,
// "isWorking": true,
// "time": 1661994066000,
// "updateTime": 1661994066000
// }
// ]
//
ch <- this.ParseOrders(response, market)
return nil
} else {
if IsTrue(!IsEqual(symbol, nil)) {
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
// method can be either: contractPrivatePostOrderCancelAll or contractPrivatePostPlanorderCancelAll
// the Planorder endpoints work not only for stop-market orders but also for stop-limit orders that are supposed to have separate endpoint
var method interface{} = this.SafeString(this.Options, "cancelAllOrders", "contractPrivatePostOrderCancelAll")
method = this.SafeString(query, "method", method)
var response interface{} = nil
if IsTrue(IsEqual(method, "contractPrivatePostOrderCancelAll")) {
response = (<-this.ContractPrivatePostOrderCancelAll(this.Extend(request, query)))
PanicOnError(response)
} else if IsTrue(IsEqual(method, "contractPrivatePostPlanorderCancelAll")) {
response = (<-this.ContractPrivatePostPlanorderCancelAll(this.Extend(request, query)))
PanicOnError(response)
}
//
// {
// "success": true,
// "code": "0"
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseOrders(data, market)
return nil
}
return nil
}()
return ch
}
func (this *mexc) ParseOrder(order interface{}, optionalArgs ...interface{}) interface{} {
//
// spot: createOrder
//
// {
// "symbol": "BTCUSDT",
// "orderId": "123738410679123456",
// "orderListId": -1
// }
//
// margin: createOrder
//
// {
// "symbol": "BTCUSDT",
// "orderId": "762634301354414080",
// "clientOrderId": null,
// "isIsolated": true,
// "transactTime": 1661992652132
// }
//
// spot: cancelOrder, cancelAllOrders
//
// {
// "symbol": "BTCUSDT",
// "orderId": "133926441921286144",
// "price": "30000",
// "origQty": "0.0002",
// "type": "LIMIT",
// "side": "BUY"
// }
//
// margin: cancelOrder, cancelAllOrders
//
// {
// "symbol": "BTCUSDT",
// "orderId": "762640232574226432",
// "orderListId": "-1",
// "clientOrderId": null,
// "price": "18000",
// "origQty": "0.00147",
// "executedQty": "0",
// "cummulativeQuoteQty": "0",
// "status": "NEW",
// "type": "LIMIT",
// "side": "BUY",
// "isIsolated": true,
// "isWorking": true,
// "time": 1661994066000,
// "updateTime": 1661994066000
// }
//
// spot: fetchOrder, fetchOpenOrders, fetchOrders
//
// {
// "symbol": "BTCUSDT",
// "orderId": "133734823834147272",
// "orderListId": "-1",
// "clientOrderId": null,
// "price": "30000",
// "origQty": "0.0002",
// "executedQty": "0",
// "cummulativeQuoteQty": "0",
// "status": "CANCELED",
// "timeInForce": null,
// "type": "LIMIT",
// "side": "BUY",
// "stopPrice": null,
// "icebergQty": null,
// "time": "1647667102000",
// "updateTime": "1647708567000",
// "isWorking": true,
// "origQuoteOrderQty": "6"
// }
//
// margin: fetchOrder, fetchOrders
//
// {
// "symbol": "BTCUSDT",
// "orderId": "763307297891028992",
// "orderListId": "-1",
// "clientOrderId": null,
// "price": "18000",
// "origQty": "0.0014",
// "executedQty": "0",
// "cummulativeQuoteQty": "0",
// "status": "NEW",
// "type": "LIMIT",
// "side": "BUY",
// "isIsolated": true,
// "isWorking": true,
// "time": 1662153107000,
// "updateTime": 1662153107000
// }
//
// swap: createOrder
//
// 2ff3163e8617443cb9c6fc19d42b1ca4
//
// swap: fetchOrder, fetchOrders
//
// regular
// {
// "orderId": "264995729269765120",
// "symbol": "STEPN_USDT",
// "positionId": "0",
// "price": "2.2",
// "vol": "15",
// "leverage": "20",
// "side": "1", // TODO: not unified
// "category": "1",
// "orderType": "1", // TODO: not unified
// "dealAvgPrice": "0",
// "dealVol": "0",
// "orderMargin": "2.2528",
// "takerFee": "0",
// "makerFee": "0",
// "profit": "0",
// "feeCurrency": "USDT",
// "openType": "1",
// "state": "2", // TODO
// "externalOid": "_m_0e9520c256744d64b942985189026d20",
// "errorCode": "0",
// "usedMargin": "0",
// "createTime": "1648850305236",
// "updateTime": "1648850305245",
// "positionMode": "1"
// }
//
// stop
// {
// "id": "265557643326564352",
// "triggerType": "1",
// "triggerPrice": "3",
// "price": "2.9", // not present in stop-market, but in stop-limit order
// "executeCycle": "87600",
// "trend": "1",
// // below keys are same as in regular order structure
// "symbol": "STEPN_USDT",
// "leverage": "20",
// "side": "1",
// "vol": "13",
// "openType": "1",
// "state": "1",
// "orderType": "1",
// "errorCode": "0",
// "createTime": "1648984276000",
// "updateTime": "1648984276000",
// }
//
// createOrders error
//
// {
// "newClientOrderId": "123456",
// "msg": "The minimum transaction volume cannot be less than:0.5USDT",
// "code": 30002
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var code interface{} = this.SafeInteger(order, "code")
if IsTrue(!IsEqual(code, nil)) {
// error upon placing multiple orders
return this.SafeOrder(map[string]interface{} {
"info": order,
"status": "rejected",
"clientOrderId": this.SafeString(order, "newClientOrderId"),
})
}
var id interface{} = nil
if IsTrue(IsString(order)) {
id = order
} else {
id = this.SafeString2(order, "orderId", "id")
}
var marketId interface{} = this.SafeString(order, "symbol")
market = this.SafeMarket(marketId, market)
var timestamp interface{} = this.SafeIntegerN(order, []interface{}{"time", "createTime", "transactTime"})
var fee interface{} = nil
var feeCurrency interface{} = this.SafeString(order, "feeCurrency")
if IsTrue(!IsEqual(feeCurrency, nil)) {
var takerFee interface{} = this.SafeString(order, "takerFee")
var makerFee interface{} = this.SafeString(order, "makerFee")
var feeSum interface{} = Precise.StringAdd(takerFee, makerFee)
fee = map[string]interface{} {
"currency": feeCurrency,
"cost": this.ParseNumber(feeSum),
}
}
return this.SafeOrder(map[string]interface{} {
"id": id,
"clientOrderId": this.SafeString(order, "clientOrderId"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"lastTradeTimestamp": nil,
"status": this.ParseOrderStatus(this.SafeString2(order, "status", "state")),
"symbol": GetValue(market, "symbol"),
"type": this.ParseOrderType(this.SafeString(order, "type")),
"timeInForce": this.ParseOrderTimeInForce(this.SafeString(order, "timeInForce")),
"side": this.ParseOrderSide(this.SafeString(order, "side")),
"price": this.SafeNumber(order, "price"),
"triggerPrice": this.SafeNumber2(order, "stopPrice", "triggerPrice"),
"average": this.SafeNumber(order, "dealAvgPrice"),
"amount": this.SafeNumber2(order, "origQty", "vol"),
"cost": this.SafeNumber(order, "cummulativeQuoteQty"),
"filled": this.SafeNumber2(order, "executedQty", "dealVol"),
"remaining": nil,
"fee": fee,
"trades": nil,
"info": order,
}, market)
}
func (this *mexc) ParseOrderSide(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"BUY": "buy",
"SELL": "sell",
"1": "buy",
"2": "sell",
}
return this.SafeString(statuses, status, status)
}
func (this *mexc) ParseOrderType(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"MARKET": "market",
"LIMIT": "limit",
"LIMIT_MAKER": "limit",
}
return this.SafeString(statuses, status, status)
}
func (this *mexc) ParseOrderStatus(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"NEW": "open",
"FILLED": "closed",
"CANCELED": "canceled",
"PARTIALLY_FILLED": "open",
"PARTIALLY_CANCELED": "canceled",
"2": "open",
"3": "closed",
"4": "canceled",
}
return this.SafeString(statuses, status, status)
}
func (this *mexc) ParseOrderTimeInForce(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"GTC": "GTC",
"FOK": "FOK",
"IOC": "IOC",
}
return this.SafeString(statuses, status, status)
}
func (this *mexc) FetchAccountHelper(typeVar interface{}, params interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
if IsTrue(IsEqual(typeVar, "spot")) {
retRes366319 := (<-this.SpotPrivateGetAccount(params))
PanicOnError(retRes366319)
ch <- retRes366319
return nil
} else if IsTrue(IsEqual(typeVar, "swap")) {
response:= (<-this.ContractPrivateGetAccountAssets(params))
PanicOnError(response)
//
// {
// "success":true,
// "code":0,
// "data":[
// {
// "currency":"BSV",
// "positionMargin":0,
// "availableBalance":0,
// "cashBalance":0,
// "frozenBalance":0,
// "equity":0,
// "unrealized":0,
// "bonus":0
// },
// ]
// }
//
ch <- this.SafeValue(response, "data")
return nil
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchAccounts
* @description fetch all the accounts associated with a profile
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#account-information
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-all-informations-of-user-39-s-asset
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a dictionary of [account structures]{@link https://docs.ccxt.com/#/?id=account-structure} indexed by the account type
*/
func (this *mexc) FetchAccounts(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
// TODO: is the below endpoints suitable for fetchAccounts?
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchAccounts", nil, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
retRes37298 := (<-this.LoadMarkets())
PanicOnError(retRes37298)
response:= (<-this.FetchAccountHelper(marketType, query))
PanicOnError(response)
var data interface{} = this.SafeValue(response, "balances", []interface{}{})
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
var account interface{} = GetValue(data, i)
var currencyId interface{} = this.SafeString2(account, "asset", "currency")
var code interface{} = this.SafeCurrencyCode(currencyId)
AppendToArray(&result,map[string]interface{} {
"id": this.SafeString(account, "id"),
"type": this.SafeString(account, "type"),
"code": code,
"info": account,
})
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchTradingFee
* @description fetch the trading fees for a market
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#query-mx-deduct-status
* @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 *mexc) 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
retRes37578 := (<-this.LoadMarkets())
PanicOnError(retRes37578)
var market interface{} = this.Market(symbol)
if !IsTrue(GetValue(market, "spot")) {
panic(BadRequest(Add(this.Id, " fetchTradingFee() supports spot markets only")))
}
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
response:= (<-this.SpotPrivateGetTradeFee(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "data":{
// "makerCommission":0.003000000000000000,
// "takerCommission":0.003000000000000000
// },
// "code":0,
// "msg":"success",
// "timestamp":1669109672717
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
ch <- map[string]interface{} {
"info": data,
"symbol": symbol,
"maker": this.SafeNumber(data, "makerCommission"),
"taker": this.SafeNumber(data, "takerCommission"),
"percentage": nil,
"tierBased": nil,
}
return nil
}()
return ch
}
func (this *mexc) CustomParseBalance(response interface{}, marketType interface{}) interface{} {
//
// spot
//
// {
// "asset": "USDT",
// "free": "0.000000000674",
// "locked": "0"
// }
//
// swap
//
// {
// "currency": "BSV",
// "positionMargin": 0,
// "availableBalance": 0,
// "cashBalance": 0,
// "frozenBalance": 0,
// "equity": 0,
// "unrealized": 0,
// "bonus": 0
// }
//
// margin
//
// {
// "baseAsset": {
// "asset": "BTC",
// "borrowEnabled": true,
// "borrowed": "0",
// "free": "0",
// "interest": "0",
// "locked": "0",
// "netAsset": "0",
// "netAssetOfBtc": "0",
// "repayEnabled": true,
// "totalAsset": "0"
// }
// "quoteAsset": {
// "asset": "USDT",
// "borrowEnabled": true,
// "borrowed": "0",
// "free": "10",
// "interest": "0",
// "locked": "0",
// "netAsset": "10",
// "netAssetOfBtc": "0",
// "repayEnabled": true,
// "totalAsset": "10"
// }
// "symbol": "BTCUSDT",
// "isolatedCreated": true,
// "enabled": true,
// "marginLevel": "999",
// "marginRatio": "9",
// "indexPrice": "16741.137068965517241379",
// "liquidatePrice": "--",
// "liquidateRate": "--",
// "tradeEnabled": true
// }
//
var wallet interface{} = nil
if IsTrue(IsEqual(marketType, "margin")) {
wallet = this.SafeValue(response, "assets", []interface{}{})
} else if IsTrue(IsEqual(marketType, "swap")) {
wallet = this.SafeValue(response, "data", []interface{}{})
} else {
wallet = this.SafeValue(response, "balances", []interface{}{})
}
var result interface{} = map[string]interface{} {
"info": response,
}
if IsTrue(IsEqual(marketType, "margin")) {
for i := 0; IsLessThan(i, GetArrayLength(wallet)); i++ {
var entry interface{} = GetValue(wallet, i)
var marketId interface{} = this.SafeString(entry, "symbol")
var symbol interface{} = this.SafeSymbol(marketId, nil)
var base interface{} = this.SafeValue(entry, "baseAsset", map[string]interface{} {})
var quote interface{} = this.SafeValue(entry, "quoteAsset", map[string]interface{} {})
var baseCode interface{} = this.SafeCurrencyCode(this.SafeString(base, "asset"))
var quoteCode interface{} = this.SafeCurrencyCode(this.SafeString(quote, "asset"))
var subResult interface{} = map[string]interface{} {}
AddElementToObject(subResult, baseCode, this.ParseBalanceHelper(base))
AddElementToObject(subResult, quoteCode, this.ParseBalanceHelper(quote))
AddElementToObject(result, symbol, this.SafeBalance(subResult))
}
return result
} else if IsTrue(IsEqual(marketType, "swap")) {
for i := 0; IsLessThan(i, GetArrayLength(wallet)); i++ {
var entry interface{} = GetValue(wallet, i)
var currencyId interface{} = this.SafeString(entry, "currency")
var code interface{} = this.SafeCurrencyCode(currencyId)
var account interface{} = this.Account()
AddElementToObject(account, "free", this.SafeString(entry, "availableBalance"))
AddElementToObject(account, "used", this.SafeString(entry, "frozenBalance"))
AddElementToObject(result, code, account)
}
return this.SafeBalance(result)
} else {
for i := 0; IsLessThan(i, GetArrayLength(wallet)); i++ {
var entry interface{} = GetValue(wallet, i)
var currencyId interface{} = this.SafeString(entry, "asset")
var code interface{} = this.SafeCurrencyCode(currencyId)
var account interface{} = this.Account()
AddElementToObject(account, "free", this.SafeString(entry, "free"))
AddElementToObject(account, "used", this.SafeString(entry, "locked"))
AddElementToObject(result, code, account)
}
return this.SafeBalance(result)
}
}
func (this *mexc) ParseBalanceHelper(entry interface{}) interface{} {
var account interface{} = this.Account()
AddElementToObject(account, "used", this.SafeString(entry, "locked"))
AddElementToObject(account, "free", this.SafeString(entry, "free"))
AddElementToObject(account, "total", this.SafeString(entry, "totalAsset"))
var debt interface{} = this.SafeString(entry, "borrowed")
var interest interface{} = this.SafeString(entry, "interest")
AddElementToObject(account, "debt", Precise.StringAdd(debt, interest))
return account
}
/**
* @method
* @name mexc#fetchBalance
* @description query for balance and get the amount of funds available for trading or funds locked in orders
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#account-information
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-all-informations-of-user-39-s-asset
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#isolated-account
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.symbols] // required for margin, market id's separated by commas
* @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
*/
func (this *mexc) 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
retRes39218 := (<-this.LoadMarkets())
PanicOnError(retRes39218)
var marketType interface{} = nil
var request interface{} = map[string]interface{} {}
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchBalance", nil, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
var marginMode interface{} = this.SafeString(params, "marginMode")
var isMargin interface{} = this.SafeBool(params, "margin", false)
params = this.Omit(params, []interface{}{"margin", "marginMode"})
var response interface{} = nil
if IsTrue(IsTrue(IsTrue((!IsEqual(marginMode, nil))) || IsTrue((isMargin))) || IsTrue((IsEqual(marketType, "margin")))) {
var parsedSymbols interface{} = nil
var symbol interface{} = this.SafeString(params, "symbol")
if IsTrue(IsEqual(symbol, nil)) {
var symbols interface{} = this.SafeValue(params, "symbols")
if IsTrue(!IsEqual(symbols, nil)) {
parsedSymbols = Join(this.MarketIds(symbols), ",")
}
} else {
var market interface{} = this.Market(symbol)
parsedSymbols = GetValue(market, "id")
}
this.CheckRequiredArgument("fetchBalance", parsedSymbols, "symbol or symbols")
marketType = "margin"
AddElementToObject(request, "symbols", parsedSymbols)
params = this.Omit(params, []interface{}{"symbol", "symbols"})
response = (<-this.SpotPrivateGetMarginIsolatedAccount(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marketType, "spot")) {
response = (<-this.SpotPrivateGetAccount(this.Extend(request, params)))
PanicOnError(response)
} else if IsTrue(IsEqual(marketType, "swap")) {
response = (<-this.ContractPrivateGetAccountAssets(this.Extend(request, params)))
PanicOnError(response)
} else {
panic(NotSupported(Add(this.Id, " fetchBalance() not support this method")))
}
//
// spot
//
// {
// "makerCommission": 0,
// "takerCommission": 20,
// "buyerCommission": 0,
// "sellerCommission": 0,
// "canTrade": true,
// "canWithdraw": true,
// "canDeposit": true,
// "updateTime": null,
// "accountType": "SPOT",
// "balances": [
// {
// "asset": "USDT",
// "free": "0.000000000674",
// "locked": "0"
// },
// ],
// "permissions": ["SPOT"]
// }
//
// swap
//
// {
// "success": true,
// "code": 0,
// "data": [
// {
// "currency": "BSV",
// "positionMargin": 0,
// "availableBalance": 0,
// "cashBalance": 0,
// "frozenBalance": 0,
// "equity": 0,
// "unrealized": 0,
// "bonus": 0
// },
// ]
// }
//
// margin
//
// {
// "assets": [
// {
// "baseAsset": {
// "asset": "BTC",
// "borrowEnabled": true,
// "borrowed": "0",
// "free": "0",
// "interest": "0",
// "locked": "0",
// "netAsset": "0",
// "netAssetOfBtc": "0",
// "repayEnabled": true,
// "totalAsset": "0"
// },
// "quoteAsset": {
// "asset": "USDT",
// "borrowEnabled": true,
// "borrowed": "0",
// "free": "10",
// "interest": "0",
// "locked": "0",
// "netAsset": "10",
// "netAssetOfBtc": "0",
// "repayEnabled": true,
// "totalAsset": "10"
// },
// "symbol": "BTCUSDT",
// "isolatedCreated": true,
// "enabled": true,
// "marginLevel": "999",
// "marginRatio": "9",
// "indexPrice": "16741.137068965517241379",
// "liquidatePrice": "--",
// "liquidateRate": "--",
// "tradeEnabled": true
// }
// ]
// }
//
ch <- this.CustomParseBalance(response, marketType)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchMyTrades
* @description fetch all trades made by the user
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#account-trade-list
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-all-transaction-details-of-the-user-s-order
* @param {string} symbol unified market symbol
* @param {int} [since] the earliest time in ms to fetch trades for
* @param {int} [limit] the maximum number of trades structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {int} [params.until] the latest time in ms to fetch trades for
* @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
*/
func (this *mexc) FetchMyTrades(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchMyTrades() requires a symbol argument")))
}
retRes40578 := (<-this.LoadMarkets())
PanicOnError(retRes40578)
var market interface{} = this.Market(symbol)
var marketType interface{} = nil
marketTypeparamsVariable := this.HandleMarketTypeAndParams("fetchMyTrades", market, params);
marketType = GetValue(marketTypeparamsVariable,0);
params = GetValue(marketTypeparamsVariable,1)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
var trades interface{} = nil
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "limit", limit)
}
var until interface{} = this.SafeInteger(params, "until")
if IsTrue(!IsEqual(until, nil)) {
params = this.Omit(params, "until")
AddElementToObject(request, "endTime", until)
}
trades = (<-this.SpotPrivateGetMyTrades(this.Extend(request, params)))
PanicOnError(trades)
} else {
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "start_time", since)
var end interface{} = this.SafeInteger(params, "end_time")
if IsTrue(IsEqual(end, nil)) {
AddElementToObject(request, "end_time", this.Sum(since, GetValue(this.Options, "maxTimeTillEnd")))
}
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "page_size", limit)
}
response:= (<-this.ContractPrivateGetOrderListOrderDeals(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "code": "0",
// "data": [
// {
// "id": "299444585",
// "symbol": "STEPN_USDT",
// "side": "1",
// "vol": "1",
// "price": "2.45455",
// "feeCurrency": "USDT",
// "fee": "0.00147273",
// "timestamp": "1648924557000",
// "profit": "0",
// "category": "1",
// "orderId": "265307163526610432",
// "positionMode": "1",
// "taker": true
// }
// ]
// }
//
trades = this.SafeValue(response, "data")
}
ch <- this.ParseTrades(trades, market, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchOrderTrades
* @description fetch all the trades made from a single order
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#account-trade-list
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#query-the-order-based-on-the-order-number
* @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 *mexc) 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
retRes41538 := (<-this.LoadMarkets())
PanicOnError(retRes41538)
var request interface{} = map[string]interface{} {}
var market interface{} = nil
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
}
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchOrderTrades", market, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
var trades interface{} = nil
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " fetchOrderTrades() requires a symbol argument")))
}
AddElementToObject(request, "symbol", GetValue(market, "id"))
AddElementToObject(request, "orderId", id)
trades = (<-this.SpotPrivateGetMyTrades(this.Extend(request, query)))
PanicOnError(trades)
} else {
AddElementToObject(request, "order_id", id)
response:= (<-this.ContractPrivateGetOrderDealDetailsOrderId(this.Extend(request, query)))
PanicOnError(response)
//
// {
// "success": true,
// "code": "0",
// "data": [
// {
// "id": "299444585",
// "symbol": "STEPN_USDT",
// "side": "1",
// "vol": "1",
// "price": "2.45455",
// "feeCurrency": "USDT",
// "fee": "0.00147273",
// "timestamp": "1648924557000",
// "profit": "0",
// "category": "1",
// "orderId": "265307163526610432",
// "positionMode": "1",
// "taker": true
// }
// ]
// }
//
trades = this.SafeValue(response, "data")
}
ch <- this.ParseTrades(trades, market, since, limit, query)
return nil
}()
return ch
}
func (this *mexc) ModifyMarginHelper(symbol interface{}, amount interface{}, addOrReduce interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
var positionId interface{} = this.SafeInteger(params, "positionId")
if IsTrue(IsEqual(positionId, nil)) {
panic(ArgumentsRequired(Add(this.Id, " modifyMarginHelper() requires a positionId parameter")))
}
retRes42258 := (<-this.LoadMarkets())
PanicOnError(retRes42258)
var request interface{} = map[string]interface{} {
"positionId": positionId,
"amount": amount,
"type": addOrReduce,
}
response:= (<-this.ContractPrivatePostPositionChangeMargin(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "code": 0
// }
ch <- response
return nil
}()
return ch
}
/**
* @method
* @name mexc#reduceMargin
* @description remove margin from a position
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#increase-or-decrease-margin
* @param {string} symbol unified market symbol
* @param {float} amount the amount of margin to remove
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [margin structure]{@link https://docs.ccxt.com/#/?id=reduce-margin-structure}
*/
func (this *mexc) 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
retRes425115 := (<-this.ModifyMarginHelper(symbol, amount, "SUB", params))
PanicOnError(retRes425115)
ch <- retRes425115
return nil
}()
return ch
}
/**
* @method
* @name mexc#addMargin
* @description add margin
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#increase-or-decrease-margin
* @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 *mexc) 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
retRes426515 := (<-this.ModifyMarginHelper(symbol, amount, "ADD", params))
PanicOnError(retRes426515)
ch <- retRes426515
return nil
}()
return ch
}
/**
* @method
* @name mexc#setLeverage
* @description set the level of leverage for a market
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#switch-leverage
* @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 *mexc) 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
retRes42798 := (<-this.LoadMarkets())
PanicOnError(retRes42798)
var request interface{} = map[string]interface{} {
"leverage": leverage,
}
var positionId interface{} = this.SafeInteger(params, "positionId")
if IsTrue(IsEqual(positionId, nil)) {
var openType interface{} = this.SafeNumber(params, "openType") // 1 or 2
var positionType interface{} = this.SafeNumber(params, "positionType") // 1 or 2
var market interface{} = Ternary(IsTrue((!IsEqual(symbol, nil))), this.Market(symbol), nil)
if IsTrue(IsTrue(IsTrue((IsEqual(openType, nil))) || IsTrue((IsEqual(positionType, nil)))) || IsTrue((IsEqual(market, nil)))) {
panic(ArgumentsRequired(Add(this.Id, " setLeverage() requires a positionId parameter or a symbol argument with openType and positionType parameters, use openType 1 or 2 for isolated or cross margin respectively, use positionType 1 or 2 for long or short positions")))
} else {
AddElementToObject(request, "openType", openType)
AddElementToObject(request, "symbol", GetValue(market, "id"))
AddElementToObject(request, "positionType", positionType)
}
} else {
AddElementToObject(request, "positionId", positionId)
}
retRes429815 := (<-this.ContractPrivatePostPositionChangeLeverage(this.Extend(request, params)))
PanicOnError(retRes429815)
ch <- retRes429815
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchFundingHistory
* @description fetch the history of funding payments paid and received on this account
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-details-of-user-s-funding-rate
* @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 *mexc) 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
retRes43138 := (<-this.LoadMarkets())
PanicOnError(retRes43138)
var market interface{} = nil
var request interface{} = map[string]interface{} {}
if IsTrue(!IsEqual(symbol, nil)) {
market = this.Market(symbol)
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "page_size", limit)
}
response:= (<-this.ContractPrivateGetPositionFundingRecords(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "code": 0,
// "data": {
// "pageSize": 20,
// "totalCount": 2,
// "totalPage": 1,
// "currentPage": 1,
// "resultList": [
// {
// "id": 7423910,
// "symbol": "BTC_USDT",
// "positionType": 1,
// "positionValue": 29.30024,
// "funding": 0.00076180624,
// "rate": -0.000026,
// "settleTime": 1643299200000
// },
// {
// "id": 7416473,
// "symbol": "BTC_USDT",
// "positionType": 1,
// "positionValue": 28.9188,
// "funding": 0.0014748588,
// "rate": -0.000051,
// "settleTime": 1643270400000
// }
// ]
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
var resultList interface{} = this.SafeValue(data, "resultList", []interface{}{})
var result interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(resultList)); i++ {
var entry interface{} = GetValue(resultList, i)
var timestamp interface{} = this.SafeInteger(entry, "settleTime")
AppendToArray(&result,map[string]interface{} {
"info": entry,
"symbol": symbol,
"code": nil,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"id": this.SafeNumber(entry, "id"),
"amount": this.SafeNumber(entry, "funding"),
})
}
ch <- result
return nil
}()
return ch
}
func (this *mexc) ParseFundingRate(contract interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "symbol": "BTC_USDT",
// "fundingRate": 0.000014,
// "maxFundingRate": 0.003,
// "minFundingRate": -0.003,
// "collectCycle": 8,
// "nextSettleTime": 1643241600000,
// "timestamp": 1643240373359
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var nextFundingRate interface{} = this.SafeNumber(contract, "fundingRate")
var nextFundingTimestamp interface{} = this.SafeInteger(contract, "nextSettleTime")
var marketId interface{} = this.SafeString(contract, "symbol")
var symbol interface{} = this.SafeSymbol(marketId, market, nil, "contract")
var timestamp interface{} = this.SafeInteger(contract, "timestamp")
var interval interface{} = this.SafeString(contract, "collectCycle")
var intervalString interface{} = nil
if IsTrue(!IsEqual(interval, nil)) {
intervalString = Add(interval, "h")
}
return map[string]interface{} {
"info": contract,
"symbol": symbol,
"markPrice": nil,
"indexPrice": nil,
"interestRate": nil,
"estimatedSettlePrice": nil,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"fundingRate": nextFundingRate,
"fundingTimestamp": nextFundingTimestamp,
"fundingDatetime": this.Iso8601(nextFundingTimestamp),
"nextFundingRate": nil,
"nextFundingTimestamp": nil,
"nextFundingDatetime": nil,
"previousFundingRate": nil,
"previousFundingTimestamp": nil,
"previousFundingDatetime": nil,
"interval": intervalString,
}
}
/**
* @method
* @name mexc#fetchFundingInterval
* @description fetch the current funding rate interval
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-contract-funding-rate
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
*/
func (this *mexc) FetchFundingInterval(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
retRes443415 := (<-this.FetchFundingRate(symbol, params))
PanicOnError(retRes443415)
ch <- retRes443415
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchFundingRate
* @description fetch the current funding rate
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-contract-funding-rate
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [funding rate structure]{@link https://docs.ccxt.com/#/?id=funding-rate-structure}
*/
func (this *mexc) 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
retRes44478 := (<-this.LoadMarkets())
PanicOnError(retRes44478)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
response:= (<-this.ContractPublicGetFundingRateSymbol(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "code": 0,
// "data": {
// "symbol": "BTC_USDT",
// "fundingRate": 0.000014,
// "maxFundingRate": 0.003,
// "minFundingRate": -0.003,
// "collectCycle": 8,
// "nextSettleTime": 1643241600000,
// "timestamp": 1643240373359
// }
// }
//
var result interface{} = this.SafeValue(response, "data", map[string]interface{} {})
ch <- this.ParseFundingRate(result, market)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchFundingRateHistory
* @description fetches historical funding rate prices
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-contract-funding-rate-history
* @param {string} symbol unified symbol of the market to fetch the funding rate history for
* @param {int} [since] not used by mexc, but filtered internally by ccxt
* @param {int} [limit] mexc limit is page_size default 20, maximum is 100
* @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-rate-history-structure}
*/
func (this *mexc) 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")))
}
retRes44878 := (<-this.LoadMarkets())
PanicOnError(retRes44878)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "page_size", limit)
}
response:= (<-this.ContractPublicGetFundingRateHistory(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "code": 0,
// "data": {
// "pageSize": 2,
// "totalCount": 21,
// "totalPage": 11,
// "currentPage": 1,
// "resultList": [
// {
// "symbol": "BTC_USDT",
// "fundingRate": 0.000266,
// "settleTime": 1609804800000
// },
// {
// "symbol": "BTC_USDT",
// "fundingRate": 0.00029,
// "settleTime": 1609776000000
// }
// ]
// }
// }
//
var data interface{} = this.SafeValue(response, "data")
var result interface{} = this.SafeValue(data, "resultList", []interface{}{})
var rates interface{} = []interface{}{}
for i := 0; IsLessThan(i, GetArrayLength(result)); i++ {
var entry interface{} = GetValue(result, i)
var marketId interface{} = this.SafeString(entry, "symbol")
var symbolInner interface{} = this.SafeSymbol(marketId)
var timestamp interface{} = this.SafeInteger(entry, "settleTime")
AppendToArray(&rates,map[string]interface{} {
"info": entry,
"symbol": symbolInner,
"fundingRate": this.SafeNumber(entry, "fundingRate"),
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
})
}
var sorted interface{} = this.SortBy(rates, "timestamp")
ch <- this.FilterBySymbolSinceLimit(sorted, GetValue(market, "symbol"), since, limit)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchLeverageTiers
* @description retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes, if a market has a leverage tier of 0, then the leverage tiers cannot be obtained for this market
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-contract-information
* @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 *mexc) 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
retRes45528 := (<-this.LoadMarkets())
PanicOnError(retRes45528)
symbols = this.MarketSymbols(symbols, "swap", true, true)
response:= (<-this.ContractPublicGetDetail(params))
PanicOnError(response)
//
// {
// "success":true,
// "code":0,
// "data":[
// {
// "symbol": "BTC_USDT",
// "displayName": "BTC_USDT永续",
// "displayNameEn": "BTC_USDT SWAP",
// "positionOpenType": 3,
// "baseCoin": "BTC",
// "quoteCoin": "USDT",
// "settleCoin": "USDT",
// "contractSize": 0.0001,
// "minLeverage": 1,
// "maxLeverage": 125,
// "priceScale": 2,
// "volScale": 0,
// "amountScale": 4,
// "priceUnit": 0.5,
// "volUnit": 1,
// "minVol": 1,
// "maxVol": 1000000,
// "bidLimitPriceRate": 0.1,
// "askLimitPriceRate": 0.1,
// "takerFeeRate": 0.0006,
// "makerFeeRate": 0.0002,
// "maintenanceMarginRate": 0.004,
// "initialMarginRate": 0.008,
// "riskBaseVol": 10000,
// "riskIncrVol": 200000,
// "riskIncrMmr": 0.004,
// "riskIncrImr": 0.004,
// "riskLevelLimit": 5,
// "priceCoefficientVariation": 0.1,
// "indexOrigin": ["BINANCE","GATEIO","HUOBI","MXC"],
// "state": 0, // 0 enabled, 1 delivery, 2 completed, 3 offline, 4 pause
// "isNew": false,
// "isHot": true,
// "isHidden": false
// },
// ...
// ]
// }
//
var data interface{} = this.SafeList(response, "data")
ch <- this.ParseLeverageTiers(data, symbols, "symbol")
return nil
}()
return ch
}
func (this *mexc) ParseMarketLeverageTiers(info interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "symbol": "BTC_USDT",
// "displayName": "BTC_USDT永续",
// "displayNameEn": "BTC_USDT SWAP",
// "positionOpenType": 3,
// "baseCoin": "BTC",
// "quoteCoin": "USDT",
// "settleCoin": "USDT",
// "contractSize": 0.0001,
// "minLeverage": 1,
// "maxLeverage": 125,
// "priceScale": 2,
// "volScale": 0,
// "amountScale": 4,
// "priceUnit": 0.5,
// "volUnit": 1,
// "minVol": 1,
// "maxVol": 1000000,
// "bidLimitPriceRate": 0.1,
// "askLimitPriceRate": 0.1,
// "takerFeeRate": 0.0006,
// "makerFeeRate": 0.0002,
// "maintenanceMarginRate": 0.004,
// "initialMarginRate": 0.008,
// "riskBaseVol": 10000,
// "riskIncrVol": 200000,
// "riskIncrMmr": 0.004,
// "riskIncrImr": 0.004,
// "riskLevelLimit": 5,
// "priceCoefficientVariation": 0.1,
// "indexOrigin": ["BINANCE","GATEIO","HUOBI","MXC"],
// "state": 0, // 0 enabled, 1 delivery, 2 completed, 3 offline, 4 pause
// "isNew": false,
// "isHot": true,
// "isHidden": false
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
var marketId interface{} = this.SafeString(info, "symbol")
var maintenanceMarginRate interface{} = this.SafeString(info, "maintenanceMarginRate")
var initialMarginRate interface{} = this.SafeString(info, "initialMarginRate")
var maxVol interface{} = this.SafeString(info, "maxVol")
var riskIncrVol interface{} = this.SafeString(info, "riskIncrVol")
var riskIncrMmr interface{} = this.SafeString(info, "riskIncrMmr")
var riskIncrImr interface{} = this.SafeString(info, "riskIncrImr")
var floor interface{} = "0"
var tiers interface{} = []interface{}{}
var quoteId interface{} = this.SafeString(info, "quoteCoin")
if IsTrue(IsEqual(riskIncrVol, "0")) {
return []interface{}{map[string]interface{} {
"tier": 0,
"symbol": this.SafeSymbol(marketId, market, nil, "contract"),
"currency": this.SafeCurrencyCode(quoteId),
"minNotional": nil,
"maxNotional": nil,
"maintenanceMarginRate": nil,
"maxLeverage": this.SafeNumber(info, "maxLeverage"),
"info": info,
}}
}
for Precise.StringLt(floor, maxVol) {
var cap interface{} = Precise.StringAdd(floor, riskIncrVol)
AppendToArray(&tiers,map[string]interface{} {
"tier": this.ParseNumber(Precise.StringDiv(cap, riskIncrVol)),
"symbol": this.SafeSymbol(marketId, market, nil, "contract"),
"currency": this.SafeCurrencyCode(quoteId),
"minNotional": this.ParseNumber(floor),
"maxNotional": this.ParseNumber(cap),
"maintenanceMarginRate": this.ParseNumber(maintenanceMarginRate),
"maxLeverage": this.ParseNumber(Precise.StringDiv("1", initialMarginRate)),
"info": info,
})
initialMarginRate = Precise.StringAdd(initialMarginRate, riskIncrImr)
maintenanceMarginRate = Precise.StringAdd(maintenanceMarginRate, riskIncrMmr)
floor = cap
}
return tiers
}
func (this *mexc) ParseDepositAddress(depositAddress interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// coin: "USDT",
// network: "BNB Smart Chain(BEP20)",
// address: "0x0d48003e0c27c5de62b97c9b4cdb31fdd29da619",
// memo: null
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var address interface{} = this.SafeString(depositAddress, "address")
var currencyId interface{} = this.SafeString(depositAddress, "coin")
var networkId interface{} = this.SafeString(depositAddress, "netWork")
this.CheckAddress(address)
return map[string]interface{} {
"info": depositAddress,
"currency": this.SafeCurrencyCode(currencyId, currency),
"network": this.NetworkIdToCode(networkId, currencyId),
"address": address,
"tag": this.SafeString(depositAddress, "memo"),
}
}
/**
* @method
* @name mexc#fetchDepositAddressesByNetwork
* @description fetch a dictionary of addresses for a currency, indexed by network
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#deposit-address-supporting-network
* @param {string} code unified currency code of the currency for the deposit address
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a dictionary of [address structures]{@link https://docs.ccxt.com/#/?id=address-structure} indexed by the network
*/
func (this *mexc) 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
retRes47188 := (<-this.LoadMarkets())
PanicOnError(retRes47188)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
}
var networkCode interface{} = this.SafeString(params, "network")
var networkId interface{} = nil
if IsTrue(!IsEqual(networkCode, nil)) {
// createDepositAddress and fetchDepositAddress use a different network-id compared to withdraw
var networkUnified interface{} = this.NetworkIdToCode(networkCode, code)
var networks interface{} = this.SafeDict(currency, "networks", map[string]interface{} {})
if IsTrue(InOp(networks, networkUnified)) {
var network interface{} = this.SafeDict(networks, networkUnified, map[string]interface{} {})
var networkInfo interface{} = this.SafeValue(network, "info", map[string]interface{} {})
networkId = this.SafeString(networkInfo, "network")
} else {
networkId = this.NetworkCodeToId(networkCode, code)
}
}
if IsTrue(!IsEqual(networkId, nil)) {
AddElementToObject(request, "network", networkId)
}
params = this.Omit(params, "network")
response:= (<-this.SpotPrivateGetCapitalDepositAddress(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// coin: "USDT",
// network: "BNB Smart Chain(BEP20)",
// address: "0x0d48003e0c27c5de62b97c9b4cdb31fdd29da619",
// memo: null
// }
// ...
// ]
//
var addressStructures interface{} = this.ParseDepositAddresses(response, nil, false)
ch <- this.IndexBy(addressStructures, "network")
return nil
}()
return ch
}
/**
* @method
* @name mexc#createDepositAddress
* @description create a currency deposit address
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#generate-deposit-address-supporting-network
* @param {string} code unified currency code of the currency for the deposit address
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.network] the blockchain network name
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
*/
func (this *mexc) CreateDepositAddress(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
retRes47688 := (<-this.LoadMarkets())
PanicOnError(retRes47688)
var currency interface{} = this.Currency(code)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
}
var networkCode interface{} = this.SafeString(params, "network")
if IsTrue(IsEqual(networkCode, nil)) {
panic(ArgumentsRequired(Add(this.Id, " createDepositAddress requires a `network` parameter")))
}
// createDepositAddress and fetchDepositAddress use a different network-id compared to withdraw
var networkId interface{} = nil
var networkUnified interface{} = this.NetworkIdToCode(networkCode, code)
var networks interface{} = this.SafeDict(currency, "networks", map[string]interface{} {})
if IsTrue(InOp(networks, networkUnified)) {
var network interface{} = this.SafeDict(networks, networkUnified, map[string]interface{} {})
var networkInfo interface{} = this.SafeValue(network, "info", map[string]interface{} {})
networkId = this.SafeString(networkInfo, "network")
} else {
networkId = this.NetworkCodeToId(networkCode, code)
}
if IsTrue(!IsEqual(networkId, nil)) {
AddElementToObject(request, "network", networkId)
}
params = this.Omit(params, "network")
response:= (<-this.SpotPrivatePostCapitalDepositAddress(this.Extend(request, params)))
PanicOnError(response)
// {
// "coin": "EOS",
// "network": "EOS",
// "address": "zzqqqqqqqqqq",
// "memo": "MX10068"
// }
ch <- this.ParseDepositAddress(response, currency)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchDepositAddress
* @description fetch the deposit address for a currency associated with this account
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#deposit-address-supporting-network
* @param {string} code unified currency code
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.network] the chain of currency, this only apply for multi-chain currency, and there is no need for single chain currency
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
*/
func (this *mexc) 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
var network interface{} = this.SafeString(params, "network")
var addressStructures interface{} = (<-this.FetchDepositAddressesByNetwork(code, params))
var result interface{} = nil
if IsTrue(!IsEqual(network, nil)) {
result = this.SafeDict(addressStructures, this.NetworkIdToCode(network, code))
} else {
var options interface{} = this.SafeDict(this.Options, "defaultNetworks")
var defaultNetworkForCurrency interface{} = this.SafeString(options, code)
if IsTrue(!IsEqual(defaultNetworkForCurrency, nil)) {
result = this.SafeDict(addressStructures, defaultNetworkForCurrency)
} else {
var keys interface{} = ObjectKeys(addressStructures)
var key interface{} = this.SafeString(keys, 0)
result = this.SafeDict(addressStructures, key)
}
}
if IsTrue(IsEqual(result, nil)) {
panic(InvalidAddress(Add(Add(Add(Add(Add(this.Id, " fetchDepositAddress() cannot find a deposit address for "), code), ", and network"), network), "consider creating one using .createDepositAddress() method or in MEXC website")))
}
ch <- result
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchDeposits
* @description fetch all deposits made to an account
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#deposit-history-supporting-network
* @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
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
func (this *mexc) 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
retRes48478 := (<-this.LoadMarkets())
PanicOnError(retRes48478)
var request interface{} = map[string]interface{} {}
var currency interface{} = nil
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "coin", GetValue(currency, "id"))
// currently mexc does not have network names unified so for certain things we might need TRX or TRC-20
// due to that I'm applying the network parameter directly so the user can control it on its side
var rawNetwork interface{} = this.SafeString(params, "network")
if IsTrue(!IsEqual(rawNetwork, nil)) {
params = this.Omit(params, "network")
AddElementToObject(request, "coin", Add(Add(GetValue(request, "coin"), "-"), rawNetwork))
}
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
if IsTrue(IsGreaterThan(limit, 1000)) {
panic(ExchangeError("This exchange supports a maximum limit of 1000"))
}
AddElementToObject(request, "limit", limit)
}
response:= (<-this.SpotPrivateGetCapitalDepositHisrec(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// "amount": "10",
// "coin": "USDC-TRX",
// "network": "TRX",
// "status": "5",
// "address": "TSMcEDDvkqY9dz8RkFnrS86U59GwEZjfvh",
// "txId": "51a8f49e6f03f2c056e71fe3291aa65e1032880be855b65cecd0595a1b8af95b",
// "insertTime": "1664805021000",
// "unlockConfirm": "200",
// "confirmTimes": "203",
// "memo": "xxyy1122"
// }
// ]
//
ch <- this.ParseTransactions(response, currency, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchWithdrawals
* @description fetch all withdrawals made from an account
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#withdraw-history-supporting-network
* @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
* @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure}
*/
func (this *mexc) 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
retRes49088 := (<-this.LoadMarkets())
PanicOnError(retRes49088)
var request interface{} = map[string]interface{} {}
var currency interface{} = nil
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "coin", GetValue(currency, "id"))
}
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "startTime", since)
}
if IsTrue(!IsEqual(limit, nil)) {
if IsTrue(IsGreaterThan(limit, 1000)) {
panic(ExchangeError("This exchange supports a maximum limit of 1000"))
}
AddElementToObject(request, "limit", limit)
}
response:= (<-this.SpotPrivateGetCapitalWithdrawHistory(this.Extend(request, params)))
PanicOnError(response)
//
// [
// {
// "id": "adcd1c8322154de691b815eedcd10c42",
// "txId": "0xc8c918cd69b2246db493ef6225a72ffdc664f15b08da3e25c6879b271d05e9d0",
// "coin": "USDC-MATIC",
// "network": "MATIC",
// "address": "0xeE6C7a415995312ED52c53a0f8f03e165e0A5D62",
// "amount": "2",
// "transferType": "0",
// "status": "7",
// "transactionFee": "1",
// "confirmNo": null,
// "applyTime": "1664882739000",
// "remark": '',
// "memo": null
// }
// ]
//
ch <- this.ParseTransactions(response, currency, since, limit)
return nil
}()
return ch
}
func (this *mexc) ParseTransaction(transaction interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchDeposits
//
// {
// "amount": "10",
// "coin": "USDC-TRX",
// "network": "TRX",
// "status": "5",
// "address": "TSMcEDDvkqY9dz8RkFnrS86U59GwEZjfvh",
// "txId": "51a8f49e6f03f2c056e71fe3291aa65e1032880be855b65cecd0595a1b8af95b",
// "insertTime": "1664805021000",
// "unlockConfirm": "200",
// "confirmTimes": "203",
// "memo": "xxyy1122"
// }
//
// fetchWithdrawals
//
// {
// "id": "adcd1c8322154de691b815eedcd10c42",
// "txId": "0xc8c918cd69b2246db493ef6225a72ffdc664f15b08da3e25c6879b271d05e9d0",
// "coin": "USDC-MATIC",
// "network": "MATIC",
// "address": "0xeE6C7a415995312ED52c53a0f8f03e165e0A5D62",
// "amount": "2",
// "transferType": "0",
// "status": "7",
// "transactionFee": "1",
// "confirmNo": null,
// "applyTime": "1664882739000",
// "remark": '',
// "memo": null
// }
//
// withdraw
//
// {
// "id":"25fb2831fb6d4fc7aa4094612a26c81d"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var id interface{} = this.SafeString(transaction, "id")
var typeVar interface{} = Ternary(IsTrue((IsEqual(id, nil))), "deposit", "withdrawal")
var timestamp interface{} = this.SafeInteger2(transaction, "insertTime", "applyTime")
var currencyId interface{} = nil
var currencyWithNetwork interface{} = this.SafeString(transaction, "coin")
if IsTrue(!IsEqual(currencyWithNetwork, nil)) {
currencyId = GetValue(Split(currencyWithNetwork, "-"), 0)
}
var network interface{} = nil
var rawNetwork interface{} = this.SafeString(transaction, "network")
if IsTrue(!IsEqual(rawNetwork, nil)) {
network = this.NetworkIdToCode(rawNetwork)
}
var code interface{} = this.SafeCurrencyCode(currencyId, currency)
var status interface{} = this.ParseTransactionStatusByType(this.SafeString(transaction, "status"), typeVar)
var amountString interface{} = this.SafeString(transaction, "amount")
var address interface{} = this.SafeString(transaction, "address")
var txid interface{} = this.SafeString(transaction, "txId")
var fee interface{} = nil
var feeCostString interface{} = this.SafeString(transaction, "transactionFee")
if IsTrue(!IsEqual(feeCostString, nil)) {
fee = map[string]interface{} {
"cost": this.ParseNumber(feeCostString),
"currency": code,
}
}
if IsTrue(IsEqual(typeVar, "withdrawal")) {
// mexc withdrawal amount includes the fee
amountString = Precise.StringSub(amountString, feeCostString)
}
return map[string]interface{} {
"info": transaction,
"id": id,
"txid": txid,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"network": network,
"address": address,
"addressTo": address,
"addressFrom": nil,
"tag": this.SafeString(transaction, "memo"),
"tagTo": nil,
"tagFrom": nil,
"type": typeVar,
"amount": this.ParseNumber(amountString),
"currency": code,
"status": status,
"updated": nil,
"comment": nil,
"internal": nil,
"fee": fee,
}
}
func (this *mexc) ParseTransactionStatusByType(status interface{}, optionalArgs ...interface{}) interface{} {
typeVar := GetArg(optionalArgs, 0, nil)
_ = typeVar
var statusesByType interface{} = map[string]interface{} {
"deposit": map[string]interface{} {
"1": "failed",
"2": "pending",
"3": "pending",
"4": "pending",
"5": "ok",
"6": "pending",
"7": "failed",
},
"withdrawal": map[string]interface{} {
"1": "pending",
"2": "pending",
"3": "pending",
"4": "pending",
"5": "pending",
"6": "pending",
"7": "ok",
"8": "failed",
"9": "canceled",
"10": "pending",
},
}
var statuses interface{} = this.SafeValue(statusesByType, typeVar, map[string]interface{} {})
return this.SafeString(statuses, status, status)
}
/**
* @method
* @name mexc#fetchPosition
* @description fetch data on a single open contract trade position
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-user-s-history-position-information
* @param {string} symbol unified market symbol of the market the position is held in, default is undefined
* @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 *mexc) 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
retRes50868 := (<-this.LoadMarkets())
PanicOnError(retRes50868)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
response:= (<-this.FetchPositions(nil, this.Extend(request, params)))
PanicOnError(response)
ch <- this.SafeValue(response, 0)
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchPositions
* @description fetch all open positions
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-user-s-history-position-information
* @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 [position structure]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *mexc) 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
retRes51058 := (<-this.LoadMarkets())
PanicOnError(retRes51058)
response:= (<-this.ContractPrivateGetPositionOpenPositions(params))
PanicOnError(response)
//
// {
// "success": true,
// "code": 0,
// "data": [
// {
// "positionId": 1394650,
// "symbol": "ETH_USDT",
// "positionType": 1,
// "openType": 1,
// "state": 1,
// "holdVol": 1,
// "frozenVol": 0,
// "closeVol": 0,
// "holdAvgPrice": 1217.3,
// "openAvgPrice": 1217.3,
// "closeAvgPrice": 0,
// "liquidatePrice": 1211.2,
// "oim": 0.1290338,
// "im": 0.1290338,
// "holdFee": 0,
// "realised": -0.0073,
// "leverage": 100,
// "createTime": 1609991676000,
// "updateTime": 1609991676000,
// "autoAddIm": false
// }
// ]
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParsePositions(data, symbols)
return nil
}()
return ch
}
func (this *mexc) ParsePosition(position interface{}, optionalArgs ...interface{}) interface{} {
//
// fetchPositions
//
// {
// "positionId": 1394650,
// "symbol": "ETH_USDT",
// "positionType": 1,
// "openType": 1,
// "state": 1,
// "holdVol": 1,
// "frozenVol": 0,
// "closeVol": 0,
// "holdAvgPrice": 1217.3,
// "openAvgPrice": 1217.3,
// "closeAvgPrice": 0,
// "liquidatePrice": 1211.2,
// "oim": 0.1290338,
// "im": 0.1290338,
// "holdFee": 0,
// "realised": -0.0073,
// "leverage": 100,
// "createTime": 1609991676000,
// "updateTime": 1609991676000,
// "autoAddIm": false
// }
//
// fetchPositionsHistory
//
// {
// positionId: '390281084',
// symbol: 'RVN_USDT',
// positionType: '1',
// openType: '2',
// state: '3',
// holdVol: '0',
// frozenVol: '0',
// closeVol: '1141',
// holdAvgPrice: '0.03491',
// holdAvgPriceFullyScale: '0.03491',
// openAvgPrice: '0.03491',
// openAvgPriceFullyScale: '0.03491',
// closeAvgPrice: '0.03494',
// liquidatePrice: '0.03433',
// oim: '0',
// im: '0',
// holdFee: '0',
// realised: '0.1829',
// leverage: '50',
// createTime: '1711512408000',
// updateTime: '1711512553000',
// autoAddIm: false,
// version: '4',
// profitRatio: '0.0227',
// newOpenAvgPrice: '0.03491',
// newCloseAvgPrice: '0.03494',
// closeProfitLoss: '0.3423',
// fee: '0.1593977',
// positionShowStatus: 'CLOSED'
// }
//
market := GetArg(optionalArgs, 0, nil)
_ = market
market = this.SafeMarket(this.SafeString(position, "symbol"), market)
var symbol interface{} = GetValue(market, "symbol")
var contracts interface{} = this.SafeString(position, "holdVol")
var entryPrice interface{} = this.SafeNumber(position, "openAvgPrice")
var initialMargin interface{} = this.SafeString(position, "im")
var rawSide interface{} = this.SafeString(position, "positionType")
var side interface{} = Ternary(IsTrue((IsEqual(rawSide, "1"))), "long", "short")
var openType interface{} = this.SafeString(position, "margin_mode")
var marginType interface{} = Ternary(IsTrue((IsEqual(openType, "1"))), "isolated", "cross")
var leverage interface{} = this.SafeNumber(position, "leverage")
var liquidationPrice interface{} = this.SafeNumber(position, "liquidatePrice")
var timestamp interface{} = this.SafeInteger(position, "updateTime")
return this.SafePosition(map[string]interface{} {
"info": position,
"id": nil,
"symbol": symbol,
"contracts": this.ParseNumber(contracts),
"contractSize": nil,
"entryPrice": entryPrice,
"collateral": nil,
"side": side,
"unrealizedPnl": nil,
"leverage": this.ParseNumber(leverage),
"percentage": nil,
"marginMode": marginType,
"notional": nil,
"markPrice": nil,
"lastPrice": nil,
"liquidationPrice": liquidationPrice,
"initialMargin": this.ParseNumber(initialMargin),
"initialMarginPercentage": nil,
"maintenanceMargin": nil,
"maintenanceMarginPercentage": nil,
"marginRatio": nil,
"timestamp": timestamp,
"datetime": this.Iso8601(timestamp),
"hedged": nil,
"stopLossPrice": nil,
"takeProfitPrice": nil,
"lastUpdateTimestamp": nil,
})
}
/**
* @method
* @name mexc#fetchTransfer
* @description fetches a transfer
* @see https://mexcdevelop.github.io/apidocs/spot_v2_en/#internal-assets-transfer-order-inquiry
* @param {string} id transfer id
* @param {string} [code] not used by mexc fetchTransfer
* @param {object} params extra parameters specific to the exchange api endpoint
* @returns {object} a [transfer structure]{@link https://docs.ccxt.com/#/?id=transfer-structure}
*/
func (this *mexc) FetchTransfer(id interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
code := GetArg(optionalArgs, 0, nil)
_ = code
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchTransfer", nil, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
retRes52578 := (<-this.LoadMarkets())
PanicOnError(retRes52578)
if IsTrue(IsEqual(marketType, "spot")) {
var request interface{} = map[string]interface{} {
"transact_id": id,
}
response:= (<-this.Spot2PrivateGetAssetInternalTransferInfo(this.Extend(request, query)))
PanicOnError(response)
//
// {
// "code": "200",
// "data": {
// "currency": "USDT",
// "amount": "1",
// "transact_id": "954877a2ef54499db9b28a7cf9ebcf41",
// "from": "MAIN",
// "to": "CONTRACT",
// "transact_state": "SUCCESS"
// }
// }
//
var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
ch <- this.ParseTransfer(data)
return nil
} else if IsTrue(IsEqual(marketType, "swap")) {
panic(BadRequest(Add(Add(this.Id, " fetchTransfer() is not supported for "), marketType)))
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchTransfers
* @description fetch a history of internal transfers made on an account
* @see https://mexcdevelop.github.io/apidocs/spot_v2_en/#get-internal-assets-transfer-records
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-user-39-s-asset-transfer-records
* @param {string} code unified currency code of the currency transferred
* @param {int} [since] the earliest time in ms to fetch transfers for
* @param {int} [limit] the maximum number of transfers structures to retrieve
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object[]} a list of [transfer structures]{@link https://docs.ccxt.com/#/?id=transfer-structure}
*/
func (this *mexc) FetchTransfers(optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
code := GetArg(optionalArgs, 0, nil)
_ = code
since := GetArg(optionalArgs, 1, nil)
_ = since
limit := GetArg(optionalArgs, 2, nil)
_ = limit
params := GetArg(optionalArgs, 3, map[string]interface{} {})
_ = params
marketTypequeryVariable := this.HandleMarketTypeAndParams("fetchTransfers", nil, params);
marketType := GetValue(marketTypequeryVariable,0);
query := GetValue(marketTypequeryVariable,1)
retRes52988 := (<-this.LoadMarkets())
PanicOnError(retRes52988)
var request interface{} = map[string]interface{} {}
var currency interface{} = nil
var resultList interface{} = nil
if IsTrue(!IsEqual(code, nil)) {
currency = this.Currency(code)
AddElementToObject(request, "currency", GetValue(currency, "id"))
}
if IsTrue(IsEqual(marketType, "spot")) {
if IsTrue(!IsEqual(since, nil)) {
AddElementToObject(request, "start_time", since)
}
if IsTrue(!IsEqual(limit, nil)) {
if IsTrue(IsGreaterThan(limit, 50)) {
panic(ExchangeError("This exchange supports a maximum limit of 50"))
}
AddElementToObject(request, "page-size", limit)
}
response:= (<-this.Spot2PrivateGetAssetInternalTransferRecord(this.Extend(request, query)))
PanicOnError(response)
//
// {
// "code": "200",
// "data": {
// "total_page": "1",
// "total_size": "5",
// "result_list": [{
// "currency": "USDT",
// "amount": "1",
// "transact_id": "954877a2ef54499db9b28a7cf9ebcf41",
// "from": "MAIN",
// "to": "CONTRACT",
// "transact_state": "SUCCESS"
// },
// ...
// ]
// }
// }
//
var data interface{} = this.SafeValue(response, "data", map[string]interface{} {})
resultList = this.SafeValue(data, "result_list", []interface{}{})
} else if IsTrue(IsEqual(marketType, "swap")) {
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "page_size", limit)
}
response:= (<-this.ContractPrivateGetAccountTransferRecord(this.Extend(request, query)))
PanicOnError(response)
var data interface{} = this.SafeValue(response, "data")
resultList = this.SafeValue(data, "resultList")
}
ch <- this.ParseTransfers(resultList, currency, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name mexc#transfer
* @description transfer currency internally between wallets on the same account
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#user-universal-transfer
* @param {string} code unified currency code
* @param {float} amount amount to transfer
* @param {string} fromAccount account to transfer from
* @param {string} toAccount account to transfer to
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.symbol] market symbol required for margin account transfers eg:BTCUSDT
* @returns {object} a [transfer structure]{@link https://docs.ccxt.com/#/?id=transfer-structure}
*/
func (this *mexc) 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
retRes53878 := (<-this.LoadMarkets())
PanicOnError(retRes53878)
var currency interface{} = this.Currency(code)
var accounts interface{} = map[string]interface{} {
"spot": "SPOT",
"swap": "FUTURES",
"margin": "ISOLATED_MARGIN",
}
var fromId interface{} = this.SafeString(accounts, fromAccount)
var toId interface{} = this.SafeString(accounts, toAccount)
if IsTrue(IsEqual(fromId, nil)) {
var keys interface{} = ObjectKeys(accounts)
panic(ExchangeError(Add(Add(this.Id, " fromAccount must be one of "), Join(keys, ", "))))
}
if IsTrue(IsEqual(toId, nil)) {
var keys interface{} = ObjectKeys(accounts)
panic(ExchangeError(Add(Add(this.Id, " toAccount must be one of "), Join(keys, ", "))))
}
var request interface{} = map[string]interface{} {
"asset": GetValue(currency, "id"),
"amount": amount,
"fromAccountType": fromId,
"toAccountType": toId,
}
if IsTrue(IsTrue((IsEqual(fromId, "ISOLATED_MARGIN"))) || IsTrue((IsEqual(toId, "ISOLATED_MARGIN")))) {
var symbol interface{} = this.SafeString(params, "symbol")
params = this.Omit(params, "symbol")
if IsTrue(IsEqual(symbol, nil)) {
panic(ArgumentsRequired(Add(this.Id, " transfer() requires a symbol argument for isolated margin")))
}
var market interface{} = this.Market(symbol)
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
response:= (<-this.SpotPrivatePostCapitalTransfer(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "tranId": "ebb06123e6a64f4ab234b396c548d57e"
// }
//
var transaction interface{} = this.ParseTransfer(response, currency)
ch <- this.Extend(transaction, map[string]interface{} {
"amount": amount,
"fromAccount": fromAccount,
"toAccount": toAccount,
})
return nil
}()
return ch
}
func (this *mexc) ParseTransfer(transfer interface{}, optionalArgs ...interface{}) interface{} {
//
// spot: fetchTransfer
//
// {
// "currency": "USDT",
// "amount": "1",
// "transact_id": "b60c1df8e7b24b268858003f374ecb75",
// "from": "MAIN",
// "to": "CONTRACT",
// "transact_state": "WAIT"
// }
//
// swap: fetchTransfer
//
// {
// "currency": "USDT",
// "amount": "22.90213135",
// "txid": "fa8a1e7bf05940a3b7025856dc48d025",
// "id": "2980812",
// "type": "IN",
// "state": "SUCCESS",
// "createTime": "1648849076000",
// "updateTime": "1648849076000"
// }
//
// transfer
//
// {
// "tranId": "ebb06123e6a64f4ab234b396c548d57e"
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var currencyId interface{} = this.SafeString(transfer, "currency")
var id interface{} = this.SafeStringN(transfer, []interface{}{"transact_id", "txid", "tranId"})
var timestamp interface{} = this.SafeInteger(transfer, "createTime")
var datetime interface{} = Ternary(IsTrue((!IsEqual(timestamp, nil))), this.Iso8601(timestamp), nil)
var direction interface{} = this.SafeString(transfer, "type")
var accountFrom interface{} = nil
var accountTo interface{} = nil
if IsTrue(!IsEqual(direction, nil)) {
accountFrom = Ternary(IsTrue((IsEqual(direction, "IN"))), "MAIN", "CONTRACT")
accountTo = Ternary(IsTrue((IsEqual(direction, "IN"))), "CONTRACT", "MAIN")
} else {
accountFrom = this.SafeString(transfer, "from")
accountTo = this.SafeString(transfer, "to")
}
return map[string]interface{} {
"info": transfer,
"id": id,
"timestamp": timestamp,
"datetime": datetime,
"currency": this.SafeCurrencyCode(currencyId, currency),
"amount": this.SafeNumber(transfer, "amount"),
"fromAccount": this.ParseAccountId(accountFrom),
"toAccount": this.ParseAccountId(accountTo),
"status": this.ParseTransferStatus(this.SafeString2(transfer, "transact_state", "state")),
}
}
func (this *mexc) ParseAccountId(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"MAIN": "spot",
"CONTRACT": "swap",
}
return this.SafeString(statuses, status, status)
}
func (this *mexc) ParseTransferStatus(status interface{}) interface{} {
var statuses interface{} = map[string]interface{} {
"SUCCESS": "ok",
"FAILED": "failed",
"WAIT": "pending",
}
return this.SafeString(statuses, status, status)
}
/**
* @method
* @name mexc#withdraw
* @description make a withdrawal
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#withdraw-new
* @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 *mexc) 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
retRes55228 := (<-this.LoadMarkets())
PanicOnError(retRes55228)
var currency interface{} = this.Currency(code)
tagparamsVariable := this.HandleWithdrawTagAndParams(tag, params);
tag = GetValue(tagparamsVariable,0);
params = GetValue(tagparamsVariable,1)
var networks interface{} = this.SafeDict(this.Options, "networks", map[string]interface{} {})
var network interface{} = this.SafeString2(params, "network", "netWork") // this line allows the user to specify either ERC20 or ETH
network = this.SafeString(networks, network, network) // handle ETH > ERC-20 alias
network = this.NetworkCodeToId(network, GetValue(currency, "code"))
this.CheckAddress(address)
var request interface{} = map[string]interface{} {
"coin": GetValue(currency, "id"),
"address": address,
"amount": amount,
}
if IsTrue(!IsEqual(tag, nil)) {
AddElementToObject(request, "memo", tag)
}
if IsTrue(!IsEqual(network, nil)) {
AddElementToObject(request, "netWork", network)
params = this.Omit(params, []interface{}{"network", "netWork"})
}
response:= (<-this.SpotPrivatePostCapitalWithdraw(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "id":"7213fea8e94b4a5593d507237e5a555b"
// }
//
ch <- this.ParseTransaction(response, currency)
return nil
}()
return ch
}
/**
* @method
* @name mexc#setPositionMode
* @description set hedged to true or false for a market
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#change-position-mode
* @param {bool} hedged set to true to use dualSidePosition
* @param {string} symbol not used by mexc setPositionMode ()
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} response from the exchange
*/
func (this *mexc) 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 request interface{} = map[string]interface{} {
"positionMode": Ternary(IsTrue(hedged), 1, 2),
}
response:= (<-this.ContractPrivatePostPositionChangePositionMode(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success":true,
// "code":0
// }
//
ch <- response
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchPositionMode
* @description fetchs the position mode, hedged or one way, hedged for binance is set identically for all linear markets or all inverse markets
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-position-mode
* @param {string} symbol not used by mexc fetchPositionMode
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} an object detailing whether the market is in hedged or one-way mode
*/
func (this *mexc) FetchPositionMode(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
response:= (<-this.ContractPrivateGetPositionPositionMode(params))
PanicOnError(response)
//
// {
// "success":true,
// "code":0,
// "data":2
// }
//
var positionMode interface{} = this.SafeInteger(response, "data")
ch <- map[string]interface{} {
"info": response,
"hedged": (IsEqual(positionMode, 1)),
}
return nil
}()
return ch
}
/**
* @method
* @name mexc#fetchTransactionFees
* @description fetch deposit and withdrawal fees
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#query-the-currency-information
* @param {string[]|undefined} codes returns fees for all currencies if undefined
* @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 *mexc) 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
retRes56108 := (<-this.LoadMarkets())
PanicOnError(retRes56108)
response:= (<-this.SpotPrivateGetCapitalConfigGetall(params))
PanicOnError(response)
//
// [
// {
// "coin": "AGLD",
// "name": "Adventure Gold",
// "networkList": [
// {
// "coin": "AGLD",
// "depositDesc": null,
// "depositEnable": true,
// "minConfirm": "0",
// "name": "Adventure Gold",
// "network": "ERC20",
// "withdrawEnable": true,
// "withdrawFee": "10.000000000000000000",
// "withdrawIntegerMultiple": null,
// "withdrawMax": "1200000.000000000000000000",
// "withdrawMin": "20.000000000000000000",
// "sameAddress": false,
// "contract": "0x32353a6c91143bfd6c7d363b546e62a9a2489a20",
// "withdrawTips": null,
// "depositTips": null
// }
// ...
// ]
// },
// ...
// ]
//
ch <- this.ParseTransactionFees(response, codes)
return nil
}()
return ch
}
func (this *mexc) ParseTransactionFees(response interface{}, optionalArgs ...interface{}) interface{} {
codes := GetArg(optionalArgs, 0, nil)
_ = codes
var withdrawFees interface{} = map[string]interface{} {}
for i := 0; IsLessThan(i, GetArrayLength(response)); i++ {
var entry interface{} = GetValue(response, i)
var currencyId interface{} = this.SafeString(entry, "coin")
var currency interface{} = this.SafeCurrency(currencyId)
var code interface{} = this.SafeString(currency, "code")
if IsTrue(IsTrue((IsEqual(codes, nil))) || IsTrue((this.InArray(code, codes)))) {
AddElementToObject(withdrawFees, code, this.ParseTransactionFee(entry, currency))
}
}
return map[string]interface{} {
"withdraw": withdrawFees,
"deposit": map[string]interface{} {},
"info": response,
}
}
func (this *mexc) ParseTransactionFee(transaction interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "coin": "AGLD",
// "name": "Adventure Gold",
// "networkList": [
// {
// "coin": "AGLD",
// "depositDesc": null,
// "depositEnable": true,
// "minConfirm": "0",
// "name": "Adventure Gold",
// "network": "ERC20",
// "withdrawEnable": true,
// "withdrawFee": "10.000000000000000000",
// "withdrawIntegerMultiple": null,
// "withdrawMax": "1200000.000000000000000000",
// "withdrawMin": "20.000000000000000000",
// "sameAddress": false,
// "contract": "0x32353a6c91143bfd6c7d363b546e62a9a2489a20",
// "withdrawTips": null,
// "depositTips": null
// }
// ...
// ]
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var networkList interface{} = this.SafeValue(transaction, "networkList", []interface{}{})
var result interface{} = map[string]interface{} {}
for j := 0; IsLessThan(j, GetArrayLength(networkList)); j++ {
var networkEntry interface{} = GetValue(networkList, j)
var networkId interface{} = this.SafeString(networkEntry, "network")
var networkCode interface{} = this.SafeString(GetValue(this.Options, "networks"), networkId, networkId)
var fee interface{} = this.SafeNumber(networkEntry, "withdrawFee")
AddElementToObject(result, networkCode, fee)
}
return result
}
/**
* @method
* @name mexc#fetchDepositWithdrawFees
* @description fetch deposit and withdrawal fees
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#query-the-currency-information
* @param {string[]|undefined} codes returns fees for all currencies if undefined
* @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 *mexc) 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
retRes57118 := (<-this.LoadMarkets())
PanicOnError(retRes57118)
response:= (<-this.SpotPrivateGetCapitalConfigGetall(params))
PanicOnError(response)
//
// [
// {
// "coin": "AGLD",
// "name": "Adventure Gold",
// "networkList": [
// {
// "coin": "AGLD",
// "depositDesc": null,
// "depositEnable": true,
// "minConfirm": "0",
// "name": "Adventure Gold",
// "network": "ERC20",
// "withdrawEnable": true,
// "withdrawFee": "10.000000000000000000",
// "withdrawIntegerMultiple": null,
// "withdrawMax": "1200000.000000000000000000",
// "withdrawMin": "20.000000000000000000",
// "sameAddress": false,
// "contract": "0x32353a6c91143bfd6c7d363b546e62a9a2489a20",
// "withdrawTips": null,
// "depositTips": null
// }
// ...
// ]
// },
// ...
// ]
//
ch <- this.ParseDepositWithdrawFees(response, codes, "coin")
return nil
}()
return ch
}
func (this *mexc) ParseDepositWithdrawFee(fee interface{}, optionalArgs ...interface{}) interface{} {
//
// {
// "coin": "AGLD",
// "name": "Adventure Gold",
// "networkList": [
// {
// "coin": "AGLD",
// "depositDesc": null,
// "depositEnable": true,
// "minConfirm": "0",
// "name": "Adventure Gold",
// "network": "ERC20",
// "withdrawEnable": true,
// "withdrawFee": "10.000000000000000000",
// "withdrawIntegerMultiple": null,
// "withdrawMax": "1200000.000000000000000000",
// "withdrawMin": "20.000000000000000000",
// "sameAddress": false,
// "contract": "0x32353a6c91143bfd6c7d363b546e62a9a2489a20",
// "withdrawTips": null,
// "depositTips": null
// }
// ...
// ]
// }
//
currency := GetArg(optionalArgs, 0, nil)
_ = currency
var networkList interface{} = this.SafeValue(fee, "networkList", []interface{}{})
var result interface{} = this.DepositWithdrawFee(fee)
for j := 0; IsLessThan(j, GetArrayLength(networkList)); j++ {
var networkEntry interface{} = GetValue(networkList, j)
var networkId interface{} = this.SafeString(networkEntry, "network")
var networkCode interface{} = this.NetworkIdToCode(networkId, this.SafeString(currency, "code"))
AddElementToObject(GetValue(result, "networks"), networkCode, map[string]interface{} {
"withdraw": map[string]interface{} {
"fee": this.SafeNumber(networkEntry, "withdrawFee"),
"percentage": nil,
},
"deposit": map[string]interface{} {
"fee": nil,
"percentage": nil,
},
})
}
return this.AssignDefaultDepositWithdrawFees(result)
}
/**
* @method
* @name mexc#fetchLeverage
* @description fetch the set leverage for a market
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-leverage
* @param {string} symbol unified market symbol
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @returns {object} a [leverage structure]{@link https://docs.ccxt.com/#/?id=leverage-structure}
*/
func (this *mexc) 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
retRes58028 := (<-this.LoadMarkets())
PanicOnError(retRes58028)
var market interface{} = this.Market(symbol)
var request interface{} = map[string]interface{} {
"symbol": GetValue(market, "id"),
}
response:= (<-this.ContractPrivateGetPositionLeverage(this.Extend(request, params)))
PanicOnError(response)
//
// {
// "success": true,
// "code": 0,
// "data": [
// {
// "level": 1,
// "maxVol": 463300,
// "mmr": 0.004,
// "imr": 0.005,
// "positionType": 1,
// "openType": 1,
// "leverage": 20,
// "limitBySys": false,
// "currentMmr": 0.004
// },
// {
// "level": 1,
// "maxVol": 463300,
// "mmr": 0.004,
// "imr": 0.005,
// "positionType": 2,
// "openType": 1,
// "leverage": 20,
// "limitBySys": false,
// "currentMmr": 0.004
// }
// ]
// }
//
var data interface{} = this.SafeList(response, "data", []interface{}{})
ch <- this.ParseLeverage(data, market)
return nil
}()
return ch
}
func (this *mexc) ParseLeverage(leverage interface{}, optionalArgs ...interface{}) interface{} {
market := GetArg(optionalArgs, 0, nil)
_ = market
var marginMode interface{} = nil
var longLeverage interface{} = nil
var shortLeverage interface{} = nil
for i := 0; IsLessThan(i, GetArrayLength(leverage)); i++ {
var entry interface{} = GetValue(leverage, i)
var openType interface{} = this.SafeInteger(entry, "openType")
var positionType interface{} = this.SafeInteger(entry, "positionType")
if IsTrue(IsEqual(positionType, 1)) {
longLeverage = this.SafeInteger(entry, "leverage")
} else if IsTrue(IsEqual(positionType, 2)) {
shortLeverage = this.SafeInteger(entry, "leverage")
}
marginMode = Ternary(IsTrue((IsEqual(openType, 1))), "isolated", "cross")
}
return map[string]interface{} {
"info": leverage,
"symbol": GetValue(market, "symbol"),
"marginMode": marginMode,
"longLeverage": longLeverage,
"shortLeverage": shortLeverage,
}
}
func (this *mexc) HandleMarginModeAndParams(methodName interface{}, optionalArgs ...interface{}) interface{} {
/**
* @ignore
* @method
* @description marginMode specified by params["marginMode"], this.options["marginMode"], this.options["defaultMarginMode"], params["margin"] = true or this.options["defaultType"] = 'margin'
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {bool} [params.margin] true for trading spot-margin
* @returns {Array} the marginMode in lowercase
*/
params := GetArg(optionalArgs, 0, map[string]interface{} {})
_ = params
defaultValue := GetArg(optionalArgs, 1, nil)
_ = defaultValue
var defaultType interface{} = this.SafeString(this.Options, "defaultType")
var isMargin interface{} = this.SafeBool(params, "margin", false)
var marginMode interface{} = nil
marginModeparamsVariable := this.Exchange.HandleMarginModeAndParams(methodName, params, defaultValue);
marginMode = GetValue(marginModeparamsVariable,0);
params = GetValue(marginModeparamsVariable,1)
if IsTrue(IsTrue((IsEqual(defaultType, "margin"))) || IsTrue((IsEqual(isMargin, true)))) {
marginMode = "isolated"
}
return []interface{}{marginMode, params}
}
/**
* @method
* @name mexc#fetchPositionsHistory
* @description fetches historical positions
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#get-the-user-s-history-position-information
* @param {string[]} [symbols] unified contract symbols
* @param {int} [since] not used by mexc fetchPositionsHistory
* @param {int} [limit] the maximum amount of candles to fetch, default=1000
* @param {object} [params] extra parameters specific to the exchange api endpoint
*
* EXCHANGE SPECIFIC PARAMETERS
* @param {int} [params.type] position type1: long, 2: short
* @param {int} [params.page_num] current page number, default is 1
* @returns {object[]} a list of [position structures]{@link https://docs.ccxt.com/#/?id=position-structure}
*/
func (this *mexc) 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
retRes59018 := (<-this.LoadMarkets())
PanicOnError(retRes59018)
var request interface{} = map[string]interface{} {}
if IsTrue(!IsEqual(symbols, nil)) {
var symbolsLength interface{} = GetArrayLength(symbols)
if IsTrue(IsEqual(symbolsLength, 1)) {
var market interface{} = this.Market(GetValue(symbols, 0))
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
}
if IsTrue(!IsEqual(limit, nil)) {
AddElementToObject(request, "page_size", limit)
}
response:= (<-this.ContractPrivateGetPositionListHistoryPositions(this.Extend(request, params)))
PanicOnError(response)
//
// {
// success: true,
// code: '0',
// data: [
// {
// positionId: '390281084',
// symbol: 'RVN_USDT',
// positionType: '1',
// openType: '2',
// state: '3',
// holdVol: '0',
// frozenVol: '0',
// closeVol: '1141',
// holdAvgPrice: '0.03491',
// holdAvgPriceFullyScale: '0.03491',
// openAvgPrice: '0.03491',
// openAvgPriceFullyScale: '0.03491',
// closeAvgPrice: '0.03494',
// liquidatePrice: '0.03433',
// oim: '0',
// im: '0',
// holdFee: '0',
// realised: '0.1829',
// leverage: '50',
// createTime: '1711512408000',
// updateTime: '1711512553000',
// autoAddIm: false,
// version: '4',
// profitRatio: '0.0227',
// newOpenAvgPrice: '0.03491',
// newCloseAvgPrice: '0.03494',
// closeProfitLoss: '0.3423',
// fee: '0.1593977',
// positionShowStatus: 'CLOSED'
// },
// ...
// ]
// }
//
var data interface{} = this.SafeList(response, "data")
var positions interface{} = this.ParsePositions(data, symbols, params)
ch <- this.FilterBySinceLimit(positions, since, limit)
return nil
}()
return ch
}
/**
* @method
* @name mexc#setMarginMode
* @description set margin mode to 'cross' or 'isolated'
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#switch-leverage
* @param {string} marginMode 'cross' or 'isolated'
* @param {string} [symbol] required when there is no position, else provide params["positionId"]
* @param {object} [params] extra parameters specific to the exchange API endpoint
* @param {string} [params.positionId] required when a position is set
* @param {string} [params.direction] "long" or "short" required when there is no position
* @returns {object} response from the exchange
*/
func (this *mexc) SetMarginMode(marginMode interface{}, optionalArgs ...interface{}) <- chan interface{} {
ch := make(chan interface{})
go func() interface{} {
defer close(ch)
defer ReturnPanicError(ch)
symbol := GetArg(optionalArgs, 0, nil)
_ = symbol
params := GetArg(optionalArgs, 1, map[string]interface{} {})
_ = params
retRes59728 := (<-this.LoadMarkets())
PanicOnError(retRes59728)
var market interface{} = this.Market(symbol)
if IsTrue(GetValue(market, "spot")) {
panic(BadSymbol(Add(this.Id, " setMarginMode() supports contract markets only")))
}
marginMode = ToLower(marginMode)
if IsTrue(IsTrue(!IsEqual(marginMode, "isolated")) && IsTrue(!IsEqual(marginMode, "cross"))) {
panic(BadRequest(Add(this.Id, " setMarginMode() marginMode argument should be isolated or cross")))
}
var leverage interface{} = this.SafeInteger(params, "leverage")
if IsTrue(IsEqual(leverage, nil)) {
panic(ArgumentsRequired(Add(this.Id, " setMarginMode() requires a leverage parameter")))
}
var direction interface{} = this.SafeStringLower2(params, "direction", "positionId")
var request interface{} = map[string]interface{} {
"leverage": leverage,
"openType": Ternary(IsTrue((IsEqual(marginMode, "isolated"))), 1, 2),
}
if IsTrue(!IsEqual(symbol, nil)) {
AddElementToObject(request, "symbol", GetValue(market, "id"))
}
if IsTrue(!IsEqual(direction, nil)) {
AddElementToObject(request, "positionType", Ternary(IsTrue((IsEqual(direction, "short"))), 2, 1))
}
params = this.Omit(params, "direction")
response:= (<-this.ContractPrivatePostPositionChangeLeverage(this.Extend(request, params)))
PanicOnError(response)
//
// { success: true, code: '0' }
//
ch <- this.ParseLeverage(response, market)
return nil
}()
return ch
}
func (this *mexc) Nonce() interface{} {
return Subtract(this.Milliseconds(), this.SafeInteger(this.Options, "timeDifference", 0))
}
func (this *mexc) Sign(path interface{}, optionalArgs ...interface{}) interface{} {
api := GetArg(optionalArgs, 0, "public")
_ = 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 section interface{} = this.SafeString(api, 0)
var access interface{} = this.SafeString(api, 1)
pathparamsVariable := this.ResolvePath(path, params);
path = GetValue(pathparamsVariable,0);
params = GetValue(pathparamsVariable,1)
var url interface{} = nil
if IsTrue(IsTrue(IsEqual(section, "spot")) || IsTrue(IsEqual(section, "broker"))) {
if IsTrue(IsEqual(section, "broker")) {
url = Add(Add(GetValue(GetValue(GetValue(this.Urls, "api"), section), access), "/"), path)
} else {
url = Add(Add(Add(Add(GetValue(GetValue(GetValue(this.Urls, "api"), section), access), "/api/"), this.Version), "/"), path)
}
var urlParams interface{} = params
if IsTrue(IsEqual(access, "private")) {
if IsTrue(IsTrue(IsEqual(section, "broker")) && IsTrue((IsTrue(IsTrue((IsEqual(method, "POST"))) || IsTrue((IsEqual(method, "PUT")))) || IsTrue((IsEqual(method, "DELETE")))))) {
urlParams = map[string]interface{} {
"timestamp": this.Nonce(),
"recvWindow": this.SafeInteger(this.Options, "recvWindow", 5000),
}
body = this.Json(params)
} else {
AddElementToObject(urlParams, "timestamp", this.Nonce())
AddElementToObject(urlParams, "recvWindow", this.SafeInteger(this.Options, "recvWindow", 5000))
}
}
var paramsEncoded interface{} = ""
if IsTrue(GetArrayLength(ObjectKeys(urlParams))) {
paramsEncoded = this.Urlencode(urlParams)
url = Add(url, Add("?", paramsEncoded))
}
if IsTrue(IsEqual(access, "private")) {
this.CheckRequiredCredentials()
var signature interface{} = this.Hmac(this.Encode(paramsEncoded), this.Encode(this.Secret), sha256)
url = Add(url, Add(Add("&", "signature="), signature))
headers = map[string]interface{} {
"X-MEXC-APIKEY": this.ApiKey,
"source": this.SafeString(this.Options, "broker", "CCXT"),
}
}
if IsTrue(IsTrue(IsTrue((IsEqual(method, "POST"))) || IsTrue((IsEqual(method, "PUT")))) || IsTrue((IsEqual(method, "DELETE")))) {
AddElementToObject(headers, "Content-Type", "application/json")
}
} else if IsTrue(IsTrue(IsEqual(section, "contract")) || IsTrue(IsEqual(section, "spot2"))) {
url = Add(Add(GetValue(GetValue(GetValue(this.Urls, "api"), section), access), "/"), this.ImplodeParams(path, params))
params = this.Omit(params, this.ExtractParams(path))
if IsTrue(IsEqual(access, "public")) {
if IsTrue(GetArrayLength(ObjectKeys(params))) {
url = Add(url, Add("?", this.Urlencode(params)))
}
} else {
this.CheckRequiredCredentials()
var timestamp interface{} = ToString(this.Nonce())
var auth interface{} = ""
headers = map[string]interface{} {
"ApiKey": this.ApiKey,
"Request-Time": timestamp,
"Content-Type": "application/json",
"source": this.SafeString(this.Options, "broker", "CCXT"),
}
if IsTrue(IsEqual(method, "POST")) {
auth = this.Json(params)
body = auth
} else {
params = this.Keysort(params)
if IsTrue(GetArrayLength(ObjectKeys(params))) {
auth = Add(auth, this.Urlencode(params))
url = Add(url, Add("?", auth))
}
}
auth = Add(Add(this.ApiKey, timestamp), auth)
var signature interface{} = this.Hmac(this.Encode(auth), this.Encode(this.Secret), sha256)
AddElementToObject(headers, "Signature", signature)
}
}
return map[string]interface{} {
"url": url,
"method": method,
"body": body,
"headers": headers,
}
}
func (this *mexc) 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
}
// spot
// {"code":-1128,"msg":"Combination of optional parameters invalid.","_extend":null}
// {"success":false,"code":123456,"message":"Order quantity error...."}
//
// contract
//
// {"code":10232,"msg":"The currency not exist"}
// {"code":10216,"msg":"No available deposit address"}
// {"success":true, "code":0, "data":1634095541710}
//
var success interface{} = this.SafeBool(response, "success", false) // v1
if IsTrue(IsEqual(success, true)) {
return nil
}
var responseCode interface{} = this.SafeString(response, "code", nil)
if IsTrue(IsTrue(IsTrue((!IsEqual(responseCode, nil))) && IsTrue((!IsEqual(responseCode, "200")))) && IsTrue((!IsEqual(responseCode, "0")))) {
var feedback interface{} = Add(Add(this.Id, " "), body)
this.ThrowBroadlyMatchedException(GetValue(this.Exceptions, "broad"), body, feedback)
this.ThrowExactlyMatchedException(GetValue(this.Exceptions, "exact"), responseCode, feedback)
panic(ExchangeError(feedback))
}
return nil
}
func (this *mexc) Init(userConfig map[string]interface{}) {
this.Exchange = Exchange{}
this.Exchange.InitParent(userConfig, this.Describe().(map[string]interface{}), this)
this.Exchange.DerivedExchange = this
}