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 bybit struct { Exchange } func NewBybitCore() bybit { p := bybit{} setDefaults(&p) return p } func (this *bybit) Describe() interface{} { return this.DeepExtend(this.Exchange.Describe(), map[string]interface{} { "id": "bybit", "name": "Bybit", "countries": []interface{}{"VG"}, "version": "v5", "userAgent": nil, "rateLimit": 20, "hostname": "bybit.com", "pro": true, "certified": true, "has": map[string]interface{} { "CORS": true, "spot": true, "margin": true, "swap": true, "future": true, "option": true, "borrowCrossMargin": true, "cancelAllOrders": true, "cancelAllOrdersAfter": true, "cancelOrder": true, "cancelOrders": true, "cancelOrdersForSymbols": true, "closeAllPositions": false, "closePosition": false, "createConvertTrade": true, "createMarketBuyOrderWithCost": true, "createMarketSellOrderWithCost": true, "createOrder": true, "createOrders": true, "createOrderWithTakeProfitAndStopLoss": true, "createPostOnlyOrder": true, "createReduceOnlyOrder": true, "createStopLimitOrder": true, "createStopLossOrder": true, "createStopMarketOrder": true, "createStopOrder": true, "createTakeProfitOrder": true, "createTrailingAmountOrder": true, "createTriggerOrder": true, "editOrder": true, "editOrders": true, "fetchBalance": true, "fetchBidsAsks": "emulated", "fetchBorrowInterest": false, "fetchBorrowRateHistories": false, "fetchBorrowRateHistory": false, "fetchCanceledAndClosedOrders": true, "fetchCanceledOrders": true, "fetchClosedOrder": true, "fetchClosedOrders": true, "fetchConvertCurrencies": true, "fetchConvertQuote": true, "fetchConvertTrade": true, "fetchConvertTradeHistory": true, "fetchCrossBorrowRate": true, "fetchCrossBorrowRates": false, "fetchCurrencies": true, "fetchDeposit": false, "fetchDepositAddress": true, "fetchDepositAddresses": false, "fetchDepositAddressesByNetwork": true, "fetchDeposits": true, "fetchDepositWithdrawFee": "emulated", "fetchDepositWithdrawFees": true, "fetchFundingHistory": true, "fetchFundingRate": "emulated", "fetchFundingRateHistory": true, "fetchFundingRates": true, "fetchGreeks": true, "fetchIndexOHLCV": true, "fetchIsolatedBorrowRate": false, "fetchIsolatedBorrowRates": false, "fetchLedger": true, "fetchLeverage": true, "fetchLeverageTiers": true, "fetchLongShortRatio": false, "fetchLongShortRatioHistory": true, "fetchMarginAdjustmentHistory": false, "fetchMarketLeverageTiers": true, "fetchMarkets": true, "fetchMarkOHLCV": true, "fetchMyLiquidations": true, "fetchMySettlementHistory": true, "fetchMyTrades": true, "fetchOHLCV": true, "fetchOpenInterest": true, "fetchOpenInterestHistory": true, "fetchOpenOrder": true, "fetchOpenOrders": true, "fetchOption": true, "fetchOptionChain": true, "fetchOrder": true, "fetchOrderBook": true, "fetchOrders": false, "fetchOrderTrades": true, "fetchPosition": true, "fetchPositionHistory": "emulated", "fetchPositions": true, "fetchPositionsHistory": true, "fetchPremiumIndexOHLCV": true, "fetchSettlementHistory": true, "fetchTicker": true, "fetchTickers": true, "fetchTime": true, "fetchTrades": true, "fetchTradingFee": true, "fetchTradingFees": true, "fetchTransactions": false, "fetchTransfers": true, "fetchUnderlyingAssets": false, "fetchVolatilityHistory": true, "fetchWithdrawals": true, "repayCrossMargin": true, "sandbox": true, "setLeverage": true, "setMarginMode": true, "setPositionMode": true, "transfer": true, "withdraw": true, }, "timeframes": map[string]interface{} { "1m": "1", "3m": "3", "5m": "5", "15m": "15", "30m": "30", "1h": "60", "2h": "120", "4h": "240", "6h": "360", "12h": "720", "1d": "D", "1w": "W", "1M": "M", }, "urls": map[string]interface{} { "test": map[string]interface{} { "spot": "https://api-testnet.{hostname}", "futures": "https://api-testnet.{hostname}", "v2": "https://api-testnet.{hostname}", "public": "https://api-testnet.{hostname}", "private": "https://api-testnet.{hostname}", }, "logo": "https://github.com/user-attachments/assets/97a5d0b3-de10-423d-90e1-6620960025ed", "api": map[string]interface{} { "spot": "https://api.{hostname}", "futures": "https://api.{hostname}", "v2": "https://api.{hostname}", "public": "https://api.{hostname}", "private": "https://api.{hostname}", }, "demotrading": map[string]interface{} { "spot": "https://api-demo.{hostname}", "futures": "https://api-demo.{hostname}", "v2": "https://api-demo.{hostname}", "public": "https://api-demo.{hostname}", "private": "https://api-demo.{hostname}", }, "www": "https://www.bybit.com", "doc": []interface{}{"https://bybit-exchange.github.io/docs/inverse/", "https://bybit-exchange.github.io/docs/linear/", "https://github.com/bybit-exchange"}, "fees": "https://help.bybit.com/hc/en-us/articles/360039261154", "referral": "https://www.bybit.com/register?affiliate_id=35953", }, "api": map[string]interface{} { "public": map[string]interface{} { "get": map[string]interface{} { "spot/v3/public/symbols": 1, "spot/v3/public/quote/depth": 1, "spot/v3/public/quote/depth/merged": 1, "spot/v3/public/quote/trades": 1, "spot/v3/public/quote/kline": 1, "spot/v3/public/quote/ticker/24hr": 1, "spot/v3/public/quote/ticker/price": 1, "spot/v3/public/quote/ticker/bookTicker": 1, "spot/v3/public/server-time": 1, "spot/v3/public/infos": 1, "spot/v3/public/margin-product-infos": 1, "spot/v3/public/margin-ensure-tokens": 1, "v3/public/time": 1, "contract/v3/public/copytrading/symbol/list": 1, "derivatives/v3/public/order-book/L2": 1, "derivatives/v3/public/kline": 1, "derivatives/v3/public/tickers": 1, "derivatives/v3/public/instruments-info": 1, "derivatives/v3/public/mark-price-kline": 1, "derivatives/v3/public/index-price-kline": 1, "derivatives/v3/public/funding/history-funding-rate": 1, "derivatives/v3/public/risk-limit/list": 1, "derivatives/v3/public/delivery-price": 1, "derivatives/v3/public/recent-trade": 1, "derivatives/v3/public/open-interest": 1, "derivatives/v3/public/insurance": 1, "v5/announcements/index": 5, "v5/market/time": 5, "v5/market/kline": 5, "v5/market/mark-price-kline": 5, "v5/market/index-price-kline": 5, "v5/market/premium-index-price-kline": 5, "v5/market/instruments-info": 5, "v5/market/orderbook": 5, "v5/market/tickers": 5, "v5/market/funding/history": 5, "v5/market/recent-trade": 5, "v5/market/open-interest": 5, "v5/market/historical-volatility": 5, "v5/market/insurance": 5, "v5/market/risk-limit": 5, "v5/market/delivery-price": 5, "v5/market/account-ratio": 5, "v5/spot-lever-token/info": 5, "v5/spot-lever-token/reference": 5, "v5/spot-margin-trade/data": 5, "v5/spot-margin-trade/collateral": 5, "v5/spot-cross-margin-trade/data": 5, "v5/spot-cross-margin-trade/pledge-token": 5, "v5/spot-cross-margin-trade/borrow-token": 5, "v5/crypto-loan/collateral-data": 5, "v5/crypto-loan/loanable-data": 5, "v5/ins-loan/product-infos": 5, "v5/ins-loan/ensure-tokens-convert": 5, }, }, "private": map[string]interface{} { "get": map[string]interface{} { "v5/market/instruments-info": 5, "v2/private/wallet/fund/records": 25, "spot/v3/private/order": 2.5, "spot/v3/private/open-orders": 2.5, "spot/v3/private/history-orders": 2.5, "spot/v3/private/my-trades": 2.5, "spot/v3/private/account": 2.5, "spot/v3/private/reference": 2.5, "spot/v3/private/record": 2.5, "spot/v3/private/cross-margin-orders": 10, "spot/v3/private/cross-margin-account": 10, "spot/v3/private/cross-margin-loan-info": 10, "spot/v3/private/cross-margin-repay-history": 10, "spot/v3/private/margin-loan-infos": 10, "spot/v3/private/margin-repaid-infos": 10, "spot/v3/private/margin-ltv": 10, "asset/v3/private/transfer/inter-transfer/list/query": 50, "asset/v3/private/transfer/sub-member/list/query": 50, "asset/v3/private/transfer/sub-member-transfer/list/query": 50, "asset/v3/private/transfer/universal-transfer/list/query": 25, "asset/v3/private/coin-info/query": 25, "asset/v3/private/deposit/address/query": 10, "contract/v3/private/copytrading/order/list": 30, "contract/v3/private/copytrading/position/list": 40, "contract/v3/private/copytrading/wallet/balance": 25, "contract/v3/private/position/limit-info": 25, "contract/v3/private/order/unfilled-orders": 1, "contract/v3/private/order/list": 1, "contract/v3/private/position/list": 1, "contract/v3/private/execution/list": 1, "contract/v3/private/position/closed-pnl": 1, "contract/v3/private/account/wallet/balance": 1, "contract/v3/private/account/fee-rate": 1, "contract/v3/private/account/wallet/fund-records": 1, "unified/v3/private/order/unfilled-orders": 1, "unified/v3/private/order/list": 1, "unified/v3/private/position/list": 1, "unified/v3/private/execution/list": 1, "unified/v3/private/delivery-record": 1, "unified/v3/private/settlement-record": 1, "unified/v3/private/account/wallet/balance": 1, "unified/v3/private/account/transaction-log": 1, "unified/v3/private/account/borrow-history": 1, "unified/v3/private/account/borrow-rate": 1, "unified/v3/private/account/info": 1, "user/v3/private/frozen-sub-member": 10, "user/v3/private/query-sub-members": 5, "user/v3/private/query-api": 5, "user/v3/private/get-member-type": 1, "asset/v3/private/transfer/transfer-coin/list/query": 50, "asset/v3/private/transfer/account-coin/balance/query": 50, "asset/v3/private/transfer/account-coins/balance/query": 25, "asset/v3/private/transfer/asset-info/query": 50, "asset/v3/public/deposit/allowed-deposit-list/query": 0.17, "asset/v3/private/deposit/record/query": 10, "asset/v3/private/withdraw/record/query": 10, "v5/order/realtime": 5, "v5/order/history": 5, "v5/order/spot-borrow-check": 1, "v5/position/list": 5, "v5/execution/list": 5, "v5/position/closed-pnl": 5, "v5/position/move-history": 5, "v5/pre-upgrade/order/history": 5, "v5/pre-upgrade/execution/list": 5, "v5/pre-upgrade/position/closed-pnl": 5, "v5/pre-upgrade/account/transaction-log": 5, "v5/pre-upgrade/asset/delivery-record": 5, "v5/pre-upgrade/asset/settlement-record": 5, "v5/account/wallet-balance": 1, "v5/account/borrow-history": 1, "v5/account/collateral-info": 1, "v5/asset/coin-greeks": 1, "v5/account/fee-rate": 10, "v5/account/info": 5, "v5/account/transaction-log": 1, "v5/account/contract-transaction-log": 1, "v5/account/smp-group": 1, "v5/account/mmp-state": 5, "v5/account/withdrawal": 5, "v5/asset/exchange/query-coin-list": 0.5, "v5/asset/exchange/convert-result-query": 0.5, "v5/asset/exchange/query-convert-history": 0.5, "v5/asset/exchange/order-record": 5, "v5/asset/delivery-record": 5, "v5/asset/settlement-record": 5, "v5/asset/transfer/query-asset-info": 50, "v5/asset/transfer/query-account-coins-balance": 25, "v5/asset/transfer/query-account-coin-balance": 50, "v5/asset/transfer/query-transfer-coin-list": 50, "v5/asset/transfer/query-inter-transfer-list": 50, "v5/asset/transfer/query-sub-member-list": 50, "v5/asset/transfer/query-universal-transfer-list": 25, "v5/asset/deposit/query-allowed-list": 5, "v5/asset/deposit/query-record": 10, "v5/asset/deposit/query-sub-member-record": 10, "v5/asset/deposit/query-internal-record": 5, "v5/asset/deposit/query-address": 10, "v5/asset/deposit/query-sub-member-address": 10, "v5/asset/coin/query-info": 28, "v5/asset/withdraw/query-record": 10, "v5/asset/withdraw/withdrawable-amount": 5, "v5/asset/withdraw/vasp/list": 5, "v5/user/query-sub-members": 5, "v5/user/query-api": 5, "v5/user/sub-apikeys": 5, "v5/user/get-member-type": 5, "v5/user/aff-customer-info": 5, "v5/user/del-submember": 5, "v5/user/submembers": 5, "v5/affiliate/aff-user-list": 5, "v5/spot-lever-token/order-record": 1, "v5/spot-margin-trade/interest-rate-history": 5, "v5/spot-margin-trade/state": 5, "v5/spot-cross-margin-trade/loan-info": 1, "v5/spot-cross-margin-trade/account": 1, "v5/spot-cross-margin-trade/orders": 1, "v5/spot-cross-margin-trade/repay-history": 1, "v5/crypto-loan/borrowable-collateralisable-number": 5, "v5/crypto-loan/ongoing-orders": 5, "v5/crypto-loan/repayment-history": 5, "v5/crypto-loan/borrow-history": 5, "v5/crypto-loan/max-collateral-amount": 5, "v5/crypto-loan/adjustment-history": 5, "v5/ins-loan/product-infos": 5, "v5/ins-loan/ensure-tokens-convert": 5, "v5/ins-loan/loan-order": 5, "v5/ins-loan/repaid-history": 5, "v5/ins-loan/ltv-convert": 5, "v5/lending/info": 5, "v5/lending/history-order": 5, "v5/lending/account": 5, "v5/broker/earning-record": 5, "v5/broker/earnings-info": 5, "v5/broker/account-info": 5, "v5/broker/asset/query-sub-member-deposit-record": 10, }, "post": map[string]interface{} { "spot/v3/private/order": 2.5, "spot/v3/private/cancel-order": 2.5, "spot/v3/private/cancel-orders": 2.5, "spot/v3/private/cancel-orders-by-ids": 2.5, "spot/v3/private/purchase": 2.5, "spot/v3/private/redeem": 2.5, "spot/v3/private/cross-margin-loan": 10, "spot/v3/private/cross-margin-repay": 10, "asset/v3/private/transfer/inter-transfer": 150, "asset/v3/private/withdraw/create": 300, "asset/v3/private/withdraw/cancel": 50, "asset/v3/private/transfer/sub-member-transfer": 150, "asset/v3/private/transfer/transfer-sub-member-save": 150, "asset/v3/private/transfer/universal-transfer": 10, "user/v3/private/create-sub-member": 10, "user/v3/private/create-sub-api": 10, "user/v3/private/update-api": 10, "user/v3/private/delete-api": 10, "user/v3/private/update-sub-api": 10, "user/v3/private/delete-sub-api": 10, "contract/v3/private/copytrading/order/create": 30, "contract/v3/private/copytrading/order/cancel": 30, "contract/v3/private/copytrading/order/close": 30, "contract/v3/private/copytrading/position/close": 40, "contract/v3/private/copytrading/position/set-leverage": 40, "contract/v3/private/copytrading/wallet/transfer": 25, "contract/v3/private/copytrading/order/trading-stop": 2.5, "contract/v3/private/order/create": 1, "contract/v3/private/order/cancel": 1, "contract/v3/private/order/cancel-all": 1, "contract/v3/private/order/replace": 1, "contract/v3/private/position/set-auto-add-margin": 1, "contract/v3/private/position/switch-isolated": 1, "contract/v3/private/position/switch-mode": 1, "contract/v3/private/position/switch-tpsl-mode": 1, "contract/v3/private/position/set-leverage": 1, "contract/v3/private/position/trading-stop": 1, "contract/v3/private/position/set-risk-limit": 1, "contract/v3/private/account/setMarginMode": 1, "unified/v3/private/order/create": 30, "unified/v3/private/order/replace": 30, "unified/v3/private/order/cancel": 30, "unified/v3/private/order/create-batch": 30, "unified/v3/private/order/replace-batch": 30, "unified/v3/private/order/cancel-batch": 30, "unified/v3/private/order/cancel-all": 30, "unified/v3/private/position/set-leverage": 2.5, "unified/v3/private/position/tpsl/switch-mode": 2.5, "unified/v3/private/position/set-risk-limit": 2.5, "unified/v3/private/position/trading-stop": 2.5, "unified/v3/private/account/upgrade-unified-account": 2.5, "unified/v3/private/account/setMarginMode": 2.5, "fht/compliance/tax/v3/private/registertime": 50, "fht/compliance/tax/v3/private/create": 50, "fht/compliance/tax/v3/private/status": 50, "fht/compliance/tax/v3/private/url": 50, "v5/order/create": 2.5, "v5/order/amend": 5, "v5/order/cancel": 2.5, "v5/order/cancel-all": 50, "v5/order/create-batch": 5, "v5/order/amend-batch": 5, "v5/order/cancel-batch": 5, "v5/order/disconnected-cancel-all": 5, "v5/position/set-leverage": 5, "v5/position/switch-isolated": 5, "v5/position/set-tpsl-mode": 5, "v5/position/switch-mode": 5, "v5/position/set-risk-limit": 5, "v5/position/trading-stop": 5, "v5/position/set-auto-add-margin": 5, "v5/position/add-margin": 5, "v5/position/move-positions": 5, "v5/position/confirm-pending-mmr": 5, "v5/account/upgrade-to-uta": 5, "v5/account/quick-repayment": 5, "v5/account/set-margin-mode": 5, "v5/account/set-hedging-mode": 5, "v5/account/mmp-modify": 5, "v5/account/mmp-reset": 5, "v5/asset/exchange/quote-apply": 1, "v5/asset/exchange/convert-execute": 1, "v5/asset/transfer/inter-transfer": 50, "v5/asset/transfer/save-transfer-sub-member": 150, "v5/asset/transfer/universal-transfer": 10, "v5/asset/deposit/deposit-to-account": 5, "v5/asset/withdraw/create": 50, "v5/asset/withdraw/cancel": 50, "v5/user/create-sub-member": 10, "v5/user/create-sub-api": 10, "v5/user/frozen-sub-member": 10, "v5/user/update-api": 10, "v5/user/update-sub-api": 10, "v5/user/delete-api": 10, "v5/user/delete-sub-api": 10, "v5/spot-lever-token/purchase": 2.5, "v5/spot-lever-token/redeem": 2.5, "v5/spot-margin-trade/switch-mode": 5, "v5/spot-margin-trade/set-leverage": 5, "v5/spot-cross-margin-trade/loan": 2.5, "v5/spot-cross-margin-trade/repay": 2.5, "v5/spot-cross-margin-trade/switch": 2.5, "v5/crypto-loan/borrow": 5, "v5/crypto-loan/repay": 5, "v5/crypto-loan/adjust-ltv": 5, "v5/ins-loan/association-uid": 5, "v5/lending/purchase": 5, "v5/lending/redeem": 5, "v5/lending/redeem-cancel": 5, "v5/account/set-collateral-switch": 5, "v5/account/set-collateral-switch-batch": 5, "v5/account/demo-apply-money": 5, "v5/broker/award/info": 5, "v5/broker/award/distribute-award": 5, "v5/broker/award/distribution-record": 5, }, }, }, "httpExceptions": map[string]interface{} { "403": RateLimitExceeded, }, "exceptions": map[string]interface{} { "exact": map[string]interface{} { "-10009": BadRequest, "-1004": BadRequest, "-1021": BadRequest, "-1103": BadRequest, "-1140": InvalidOrder, "-1197": InvalidOrder, "-2013": InvalidOrder, "-2015": AuthenticationError, "-6017": BadRequest, "-6025": BadRequest, "-6029": BadRequest, "5004": ExchangeError, "7001": BadRequest, "10001": BadRequest, "10002": InvalidNonce, "10003": AuthenticationError, "10004": AuthenticationError, "10005": PermissionDenied, "10006": RateLimitExceeded, "10007": AuthenticationError, "10008": AccountSuspended, "10009": AuthenticationError, "10010": PermissionDenied, "10014": BadRequest, "10016": ExchangeError, "10017": BadRequest, "10018": RateLimitExceeded, "10020": PermissionDenied, "10024": PermissionDenied, "10027": PermissionDenied, "10028": PermissionDenied, "10029": PermissionDenied, "12137": InvalidOrder, "12201": BadRequest, "12141": BadRequest, "100028": PermissionDenied, "110001": OrderNotFound, "110003": InvalidOrder, "110004": InsufficientFunds, "110005": InvalidOrder, "110006": InsufficientFunds, "110007": InsufficientFunds, "110008": InvalidOrder, "110009": InvalidOrder, "110010": InvalidOrder, "110011": InvalidOrder, "110012": InsufficientFunds, "110013": BadRequest, "110014": InsufficientFunds, "110015": BadRequest, "110016": InvalidOrder, "110017": InvalidOrder, "110018": BadRequest, "110019": InvalidOrder, "110020": InvalidOrder, "110021": InvalidOrder, "110022": InvalidOrder, "110023": InvalidOrder, "110024": BadRequest, "110025": NoChange, "110026": MarginModeAlreadySet, "110027": NoChange, "110028": BadRequest, "110029": BadRequest, "110030": InvalidOrder, "110031": InvalidOrder, "110032": InvalidOrder, "110033": InvalidOrder, "110034": InvalidOrder, "110035": InvalidOrder, "110036": InvalidOrder, "110037": InvalidOrder, "110038": InvalidOrder, "110039": InvalidOrder, "110040": InvalidOrder, "110041": InvalidOrder, "110042": InvalidOrder, "110043": BadRequest, "110044": InsufficientFunds, "110045": InsufficientFunds, "110046": BadRequest, "110047": BadRequest, "110048": BadRequest, "110049": BadRequest, "110050": BadRequest, "110051": InsufficientFunds, "110052": InsufficientFunds, "110053": InsufficientFunds, "110054": InvalidOrder, "110055": InvalidOrder, "110056": InvalidOrder, "110057": InvalidOrder, "110058": InvalidOrder, "110059": InvalidOrder, "110060": BadRequest, "110061": BadRequest, "110062": BadRequest, "110063": ExchangeError, "110064": InvalidOrder, "110065": PermissionDenied, "110066": ExchangeError, "110067": PermissionDenied, "110068": PermissionDenied, "110069": PermissionDenied, "110070": InvalidOrder, "110071": ExchangeError, "110072": InvalidOrder, "110073": ExchangeError, "110092": InvalidOrder, "110093": InvalidOrder, "110094": InvalidOrder, "130006": InvalidOrder, "130021": InsufficientFunds, "130074": InvalidOrder, "131001": InsufficientFunds, "131084": ExchangeError, "131200": ExchangeError, "131201": ExchangeError, "131202": BadRequest, "131203": BadRequest, "131204": BadRequest, "131205": BadRequest, "131206": ExchangeError, "131207": BadRequest, "131208": ExchangeError, "131209": BadRequest, "131210": BadRequest, "131211": BadRequest, "131212": InsufficientFunds, "131213": BadRequest, "131214": BadRequest, "131215": BadRequest, "131216": ExchangeError, "131217": ExchangeError, "131231": NotSupported, "131232": NotSupported, "131002": BadRequest, "131003": ExchangeError, "131004": AuthenticationError, "131085": InsufficientFunds, "131086": BadRequest, "131088": BadRequest, "131089": BadRequest, "131090": ExchangeError, "131091": ExchangeError, "131092": ExchangeError, "131093": ExchangeError, "131094": BadRequest, "131095": BadRequest, "131096": BadRequest, "131097": ExchangeError, "131098": ExchangeError, "131099": ExchangeError, "140001": OrderNotFound, "140003": InvalidOrder, "140004": InsufficientFunds, "140005": InvalidOrder, "140006": InsufficientFunds, "140007": InsufficientFunds, "140008": InvalidOrder, "140009": InvalidOrder, "140010": InvalidOrder, "140011": InvalidOrder, "140012": InsufficientFunds, "140013": BadRequest, "140014": InsufficientFunds, "140015": InvalidOrder, "140016": InvalidOrder, "140017": InvalidOrder, "140018": BadRequest, "140019": InvalidOrder, "140020": InvalidOrder, "140021": InvalidOrder, "140022": InvalidOrder, "140023": InvalidOrder, "140024": BadRequest, "140025": BadRequest, "140026": BadRequest, "140027": BadRequest, "140028": InvalidOrder, "140029": BadRequest, "140030": InvalidOrder, "140031": BadRequest, "140032": InvalidOrder, "140033": InvalidOrder, "140034": InvalidOrder, "140035": InvalidOrder, "140036": BadRequest, "140037": InvalidOrder, "140038": BadRequest, "140039": BadRequest, "140040": InvalidOrder, "140041": InvalidOrder, "140042": InvalidOrder, "140043": BadRequest, "140044": InsufficientFunds, "140045": InsufficientFunds, "140046": BadRequest, "140047": BadRequest, "140048": BadRequest, "140049": BadRequest, "140050": InvalidOrder, "140051": InsufficientFunds, "140052": InsufficientFunds, "140053": InsufficientFunds, "140054": InvalidOrder, "140055": InvalidOrder, "140056": InvalidOrder, "140057": InvalidOrder, "140058": InvalidOrder, "140059": InvalidOrder, "140060": BadRequest, "140061": BadRequest, "140062": BadRequest, "140063": ExchangeError, "140064": InvalidOrder, "140065": PermissionDenied, "140066": ExchangeError, "140067": PermissionDenied, "140068": PermissionDenied, "140069": PermissionDenied, "140070": InvalidOrder, "170001": ExchangeError, "170005": InvalidOrder, "170007": RequestTimeout, "170010": InvalidOrder, "170011": InvalidOrder, "170019": InvalidOrder, "170031": ExchangeError, "170032": ExchangeError, "170033": InsufficientFunds, "170034": InsufficientFunds, "170035": BadRequest, "170036": BadRequest, "170037": BadRequest, "170105": BadRequest, "170115": InvalidOrder, "170116": InvalidOrder, "170117": InvalidOrder, "170121": InvalidOrder, "170124": InvalidOrder, "170130": BadRequest, "170131": InsufficientFunds, "170132": InvalidOrder, "170133": InvalidOrder, "170134": InvalidOrder, "170135": InvalidOrder, "170136": InvalidOrder, "170137": InvalidOrder, "170139": InvalidOrder, "170140": InvalidOrder, "170141": InvalidOrder, "170142": InvalidOrder, "170143": InvalidOrder, "170144": InvalidOrder, "170145": InvalidOrder, "170146": InvalidOrder, "170147": InvalidOrder, "170148": InvalidOrder, "170149": ExchangeError, "170150": ExchangeError, "170151": InvalidOrder, "170157": InvalidOrder, "170159": InvalidOrder, "170190": InvalidOrder, "170191": InvalidOrder, "170192": InvalidOrder, "170193": InvalidOrder, "170194": InvalidOrder, "170195": InvalidOrder, "170196": InvalidOrder, "170197": InvalidOrder, "170198": InvalidOrder, "170199": InvalidOrder, "170200": InvalidOrder, "170201": PermissionDenied, "170202": InvalidOrder, "170203": InvalidOrder, "170204": InvalidOrder, "170206": InvalidOrder, "170210": InvalidOrder, "170213": OrderNotFound, "170217": InvalidOrder, "170218": InvalidOrder, "170221": BadRequest, "170222": RateLimitExceeded, "170223": InsufficientFunds, "170224": PermissionDenied, "170226": InsufficientFunds, "170227": ExchangeError, "170228": InvalidOrder, "170229": InvalidOrder, "170234": ExchangeError, "170241": ManualInteractionNeeded, "175000": InvalidOrder, "175001": InvalidOrder, "175002": InvalidOrder, "175003": InsufficientFunds, "175004": InvalidOrder, "175005": InvalidOrder, "175006": InsufficientFunds, "175007": InvalidOrder, "175008": InvalidOrder, "175009": InvalidOrder, "175010": PermissionDenied, "175012": InvalidOrder, "175013": InvalidOrder, "175014": InvalidOrder, "175015": InvalidOrder, "175016": InvalidOrder, "175017": InvalidOrder, "175027": ExchangeError, "176002": BadRequest, "176004": BadRequest, "176003": BadRequest, "176006": BadRequest, "176005": BadRequest, "176008": BadRequest, "176007": BadRequest, "176010": BadRequest, "176009": BadRequest, "176012": BadRequest, "176011": BadRequest, "176014": BadRequest, "176013": BadRequest, "176015": InsufficientFunds, "176016": BadRequest, "176017": BadRequest, "176018": BadRequest, "176019": BadRequest, "176020": BadRequest, "176021": BadRequest, "176022": BadRequest, "176023": BadRequest, "176024": BadRequest, "176025": BadRequest, "176026": BadRequest, "176027": BadRequest, "176028": BadRequest, "176029": BadRequest, "176030": BadRequest, "176031": BadRequest, "176034": BadRequest, "176035": PermissionDenied, "176036": PermissionDenied, "176037": PermissionDenied, "176038": BadRequest, "176039": BadRequest, "176040": BadRequest, "181000": BadRequest, "181001": BadRequest, "181002": InvalidOrder, "181003": InvalidOrder, "181004": InvalidOrder, "182000": InvalidOrder, "181017": BadRequest, "20001": OrderNotFound, "20003": InvalidOrder, "20004": InvalidOrder, "20005": InvalidOrder, "20006": InvalidOrder, "20007": InvalidOrder, "20008": InvalidOrder, "20009": InvalidOrder, "20010": InvalidOrder, "20011": InvalidOrder, "20012": InvalidOrder, "20013": InvalidOrder, "20014": InvalidOrder, "20015": InvalidOrder, "20016": InvalidOrder, "20017": InvalidOrder, "20018": InvalidOrder, "20019": InvalidOrder, "20020": InvalidOrder, "20021": InvalidOrder, "20022": BadRequest, "20023": BadRequest, "20031": BadRequest, "20070": BadRequest, "20071": BadRequest, "20084": BadRequest, "30001": BadRequest, "30003": InvalidOrder, "30004": InvalidOrder, "30005": InvalidOrder, "30007": InvalidOrder, "30008": InvalidOrder, "30009": ExchangeError, "30010": InsufficientFunds, "30011": PermissionDenied, "30012": PermissionDenied, "30013": PermissionDenied, "30014": InvalidOrder, "30015": InvalidOrder, "30016": ExchangeError, "30017": InvalidOrder, "30018": InvalidOrder, "30019": InvalidOrder, "30020": InvalidOrder, "30021": InvalidOrder, "30022": InvalidOrder, "30023": InvalidOrder, "30024": InvalidOrder, "30025": InvalidOrder, "30026": InvalidOrder, "30027": InvalidOrder, "30028": InvalidOrder, "30029": InvalidOrder, "30030": InvalidOrder, "30031": InsufficientFunds, "30032": InvalidOrder, "30033": RateLimitExceeded, "30034": OrderNotFound, "30035": RateLimitExceeded, "30036": ExchangeError, "30037": InvalidOrder, "30041": ExchangeError, "30042": InsufficientFunds, "30043": InvalidOrder, "30044": InvalidOrder, "30045": InvalidOrder, "30049": InsufficientFunds, "30050": ExchangeError, "30051": ExchangeError, "30052": ExchangeError, "30054": ExchangeError, "30057": ExchangeError, "30063": ExchangeError, "30067": InsufficientFunds, "30068": ExchangeError, "30074": InvalidOrder, "30075": InvalidOrder, "30078": ExchangeError, "33004": AuthenticationError, "34026": ExchangeError, "34036": BadRequest, "35015": BadRequest, "340099": ExchangeError, "3400045": ExchangeError, "3100116": BadRequest, "3100198": BadRequest, "3200300": InsufficientFunds, }, "broad": map[string]interface{} { "Not supported symbols": BadSymbol, "Request timeout": RequestTimeout, "unknown orderInfo": OrderNotFound, "invalid api_key": AuthenticationError, "oc_diff": InsufficientFunds, "new_oc": InsufficientFunds, "openapi sign params error!": AuthenticationError, }, }, "precisionMode": TICK_SIZE, "options": map[string]interface{} { "usePrivateInstrumentsInfo": false, "enableDemoTrading": false, "fetchMarkets": []interface{}{"spot", "linear", "inverse", "option"}, "createOrder": map[string]interface{} { "method": "privatePostV5OrderCreate", }, "enableUnifiedMargin": nil, "enableUnifiedAccount": nil, "unifiedMarginStatus": nil, "createMarketBuyOrderRequiresPrice": false, "createUnifiedMarginAccount": false, "defaultType": "swap", "defaultSubType": "linear", "defaultSettle": "USDT", "code": "BTC", "recvWindow": Multiply(5, 1000), "timeDifference": 0, "adjustForTimeDifference": false, "loadAllOptions": false, "loadExpiredOptions": false, "brokerId": "CCXT", "accountsByType": map[string]interface{} { "spot": "SPOT", "margin": "SPOT", "future": "CONTRACT", "swap": "CONTRACT", "option": "OPTION", "investment": "INVESTMENT", "unified": "UNIFIED", "funding": "FUND", "fund": "FUND", "contract": "CONTRACT", }, "accountsById": map[string]interface{} { "SPOT": "spot", "MARGIN": "spot", "CONTRACT": "contract", "OPTION": "option", "INVESTMENT": "investment", "UNIFIED": "unified", "FUND": "fund", }, "networks": map[string]interface{} { "ERC20": "ETH", "TRC20": "TRX", "BEP20": "BSC", "SOL": "SOL", "ACA": "ACA", "ADA": "ADA", "ALGO": "ALGO", "APT": "APTOS", "AR": "AR", "ARBONE": "ARBI", "AVAXC": "CAVAX", "AVAXX": "XAVAX", "ATOM": "ATOM", "BCH": "BCH", "BEP2": "BNB", "CHZ": "CHZ", "DCR": "DCR", "DGB": "DGB", "DOGE": "DOGE", "DOT": "DOT", "EGLD": "EGLD", "EOS": "EOS", "ETC": "ETC", "ETHF": "ETHF", "ETHW": "ETHW", "FIL": "FIL", "STEP": "FITFI", "FLOW": "FLOW", "FTM": "FTM", "GLMR": "GLMR", "HBAR": "HBAR", "HNT": "HNT", "ICP": "ICP", "ICX": "ICX", "KDA": "KDA", "KLAY": "KLAY", "KMA": "KMA", "KSM": "KSM", "LTC": "LTC", "MATIC": "MATIC", "MINA": "MINA", "MOVR": "MOVR", "NEAR": "NEAR", "NEM": "NEM", "OASYS": "OAS", "OASIS": "ROSE", "OMNI": "OMNI", "ONE": "ONE", "OPTIMISM": "OP", "POKT": "POKT", "QTUM": "QTUM", "RVN": "RVN", "SC": "SC", "SCRT": "SCRT", "STX": "STX", "THETA": "THETA", "TON": "TON", "WAVES": "WAVES", "WAX": "WAXP", "XDC": "XDC", "XEC": "XEC", "XLM": "XLM", "XRP": "XRP", "XTZ": "XTZ", "XYM": "XYM", "ZEN": "ZEN", "ZIL": "ZIL", "ZKSYNC": "ZKSYNC", }, "networksById": map[string]interface{} { "ETH": "ERC20", "TRX": "TRC20", "BSC": "BEP20", "OMNI": "OMNI", "SPL": "SOL", }, "defaultNetwork": "ERC20", "defaultNetworks": map[string]interface{} { "USDT": "TRC20", }, "intervals": map[string]interface{} { "5m": "5min", "15m": "15min", "30m": "30min", "1h": "1h", "4h": "4h", "1d": "1d", }, }, "features": map[string]interface{} { "default": map[string]interface{} { "sandbox": true, "createOrder": map[string]interface{} { "marginMode": false, "triggerPrice": true, "triggerPriceType": map[string]interface{} { "last": true, "mark": true, "index": true, }, "triggerDirection": true, "stopLossPrice": true, "takeProfitPrice": true, "attachedStopLossTakeProfit": map[string]interface{} { "triggerPriceType": map[string]interface{} { "last": true, "mark": true, "index": true, }, "price": true, }, "timeInForce": map[string]interface{} { "IOC": true, "FOK": true, "PO": true, "GTD": false, }, "hedged": true, "selfTradePrevention": true, "trailing": true, "iceberg": false, "leverage": false, "marketBuyRequiresPrice": false, "marketBuyByCost": true, }, "createOrders": map[string]interface{} { "max": 10, }, "fetchMyTrades": map[string]interface{} { "marginMode": false, "limit": 100, "daysBack": Multiply(365, 2), "untilDays": 7, "symbolRequired": false, }, "fetchOrder": map[string]interface{} { "marginMode": false, "trigger": true, "trailing": false, "symbolRequired": true, }, "fetchOpenOrders": map[string]interface{} { "marginMode": false, "limit": 50, "trigger": true, "trailing": false, "symbolRequired": false, }, "fetchOrders": nil, "fetchClosedOrders": map[string]interface{} { "marginMode": false, "limit": 50, "daysBack": Multiply(365, 2), "daysBackCanceled": 1, "untilDays": 7, "trigger": true, "trailing": false, "symbolRequired": false, }, "fetchOHLCV": map[string]interface{} { "limit": 1000, }, "editOrders": map[string]interface{} { "max": 10, }, }, "spot": map[string]interface{} { "extends": "default", "createOrder": map[string]interface{} { "triggerPriceType": nil, "triggerDirection": false, "attachedStopLossTakeProfit": map[string]interface{} { "triggerPriceType": nil, "price": true, }, "marketBuyRequiresPrice": true, }, }, "swap": map[string]interface{} { "linear": map[string]interface{} { "extends": "default", }, "inverse": map[string]interface{} { "extends": "default", }, }, "future": map[string]interface{} { "linear": map[string]interface{} { "extends": "default", }, "inverse": map[string]interface{} { "extends": "default", }, }, }, "fees": map[string]interface{} { "trading": map[string]interface{} { "feeSide": "get", "tierBased": true, "percentage": true, "taker": 0.00075, "maker": 0.0001, }, "funding": map[string]interface{} { "tierBased": false, "percentage": false, "withdraw": map[string]interface{} {}, "deposit": map[string]interface{} {}, }, }, }) } func (this *bybit) EnableDemoTrading(enable interface{}) { /** * @method * @name bybit#enableDemoTrading * @description enables or disables demo trading mode * @see https://bybit-exchange.github.io/docs/v5/demo * @param {boolean} [enable] true if demo trading should be enabled, false otherwise */ if IsTrue(this.IsSandboxModeEnabled) { panic(NotSupported(Add(this.Id, " demo trading does not support in sandbox environment"))) } // enable demo trading in bybit, see: https://bybit-exchange.github.io/docs/v5/demo if IsTrue(enable) { AddElementToObject(this.Urls, "apiBackupDemoTrading", GetValue(this.Urls, "api")) AddElementToObject(this.Urls, "api", GetValue(this.Urls, "demotrading")) } else if IsTrue(InOp(this.Urls, "apiBackupDemoTrading")) { AddElementToObject(this.Urls, "api", GetValue(this.Urls, "apiBackupDemoTrading")) var newUrls interface{} = this.Omit(this.Urls, "apiBackupDemoTrading") this.Urls = newUrls } AddElementToObject(this.Options, "enableDemoTrading", enable) } func (this *bybit) Nonce() interface{} { return Subtract(this.Milliseconds(), GetValue(this.Options, "timeDifference")) } func (this *bybit) AddPaginationCursorToResult(response interface{}) interface{} { var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var data interface{} = this.SafeListN(result, []interface{}{"list", "rows", "data", "dataList"}, []interface{}{}) var paginationCursor interface{} = this.SafeString2(result, "nextPageCursor", "cursor") var dataLength interface{} = GetArrayLength(data) if IsTrue(IsTrue((!IsEqual(paginationCursor, nil))) && IsTrue((IsGreaterThan(dataLength, 0)))) { var first interface{} = GetValue(data, 0) AddElementToObject(first, "nextPageCursor", paginationCursor) AddElementToObject(data, 0, first) } return data } /** * @method * @name bybit#isUnifiedEnabled * @see https://bybit-exchange.github.io/docs/v5/user/apikey-info#http-request * @see https://bybit-exchange.github.io/docs/v5/account/account-info * @description returns [enableUnifiedMargin, enableUnifiedAccount] so the user can check if unified account is enabled * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {any} [enableUnifiedMargin, enableUnifiedAccount] */ func (this *bybit) IsUnifiedEnabled(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) // The API key of user id must own one of permissions will be allowed to call following API endpoints: // SUB UID: "Account Transfer" // MASTER UID: "Account Transfer", "Subaccount Transfer", "Withdrawal" params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params var enableUnifiedMargin interface{} = this.SafeBool(this.Options, "enableUnifiedMargin") var enableUnifiedAccount interface{} = this.SafeBool(this.Options, "enableUnifiedAccount") if IsTrue(IsTrue(IsEqual(enableUnifiedMargin, nil)) || IsTrue(IsEqual(enableUnifiedAccount, nil))) { if IsTrue(GetValue(this.Options, "enableDemoTrading")) { // info endpoint is not available in demo trading // so we're assuming UTA is enabled AddElementToObject(this.Options, "enableUnifiedMargin", false) AddElementToObject(this.Options, "enableUnifiedAccount", true) AddElementToObject(this.Options, "unifiedMarginStatus", 6) ch <- []interface{}{GetValue(this.Options, "enableUnifiedMargin"), GetValue(this.Options, "enableUnifiedAccount")} return nil } var rawPromises interface{} = []interface{}{this.PrivateGetV5UserQueryApi(params), this.PrivateGetV5AccountInfo(params)} promises:= (<-promiseAll(rawPromises)) PanicOnError(promises) var response interface{} = GetValue(promises, 0) var accountInfo interface{} = GetValue(promises, 1) // // { // "retCode": 0, // "retMsg": "", // "result": { // "id": "13770661", // "note": "XXXXXX", // "apiKey": "XXXXXX", // "readOnly": 0, // "secret": "", // "permissions": { // "ContractTrade": [...], // "Spot": [...], // "Wallet": [...], // "Options": [...], // "Derivatives": [...], // "CopyTrading": [...], // "BlockTrade": [...], // "Exchange": [...], // "NFT": [...], // }, // "ips": [...], // "type": 1, // "deadlineDay": 83, // "expiredAt": "2023-05-15T03:21:05Z", // "createdAt": "2022-10-16T02:24:40Z", // "unified": 0, // "uta": 0, // "userID": 24600000, // "inviterID": 0, // "vipLevel": "No VIP", // "mktMakerLevel": "0", // "affiliateID": 0, // "rsaPublicKey": "", // "isMaster": false // }, // "retExtInfo": {}, // "time": 1676891757649 // } // account info // { // "retCode": 0, // "retMsg": "OK", // "result": { // "marginMode": "REGULAR_MARGIN", // "updatedTime": "1697078946000", // "unifiedMarginStatus": 4, // "dcpStatus": "OFF", // "timeWindow": 10, // "smpGroup": 0, // "isMasterTrader": false, // "spotHedgingStatus": "OFF" // } // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var accountResult interface{} = this.SafeDict(accountInfo, "result", map[string]interface{} {}) AddElementToObject(this.Options, "enableUnifiedMargin", IsEqual(this.SafeInteger(result, "unified"), 1)) AddElementToObject(this.Options, "enableUnifiedAccount", IsEqual(this.SafeInteger(result, "uta"), 1)) AddElementToObject(this.Options, "unifiedMarginStatus", this.SafeInteger(accountResult, "unifiedMarginStatus", 6)) // default to uta 2.0 pro if not found } ch <- []interface{}{GetValue(this.Options, "enableUnifiedMargin"), GetValue(this.Options, "enableUnifiedAccount")} return nil }() return ch } /** * @method * @name bybit#upgradeUnifiedTradeAccount * @description upgrades the account to unified trade account *warning* this is irreversible * @see https://bybit-exchange.github.io/docs/v5/account/upgrade-unified-account * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {any} nothing */ func (this *bybit) UpgradeUnifiedTradeAccount(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes142115 := (<-this.PrivatePostV5AccountUpgradeToUta(params)) PanicOnError(retRes142115) ch <- retRes142115 return nil }() return ch } func (this *bybit) CreateExpiredOptionMarket(symbol interface{}) interface{} { // support expired option contracts var quote interface{} = nil var settle interface{} = nil var optionParts interface{} = Split(symbol, "-") var symbolBase interface{} = Split(symbol, "/") var base interface{} = nil var expiry interface{} = nil if IsTrue(IsGreaterThan(GetIndexOf(symbol, "/"), OpNeg(1))) { base = this.SafeString(symbolBase, 0) expiry = this.SafeString(optionParts, 1) var symbolQuoteAndSettle interface{} = this.SafeString(symbolBase, 1) var splitQuote interface{} = Split(symbolQuoteAndSettle, ":") var quoteAndSettle interface{} = this.SafeString(splitQuote, 0) quote = quoteAndSettle settle = quoteAndSettle } else { base = this.SafeString(optionParts, 0) expiry = this.ConvertMarketIdExpireDate(this.SafeString(optionParts, 1)) if IsTrue(EndsWith(symbol, "-USDT")) { quote = "USDT" settle = "USDT" } else { quote = "USDC" settle = "USDC" } } var strike interface{} = this.SafeString(optionParts, 2) var optionType interface{} = this.SafeString(optionParts, 3) var datetime interface{} = this.ConvertExpireDate(expiry) var timestamp interface{} = this.Parse8601(datetime) var amountPrecision interface{} = nil var pricePrecision interface{} = nil // hard coded amount and price precisions from fetchOptionMarkets if IsTrue(IsEqual(base, "BTC")) { amountPrecision = this.ParseNumber("0.01") pricePrecision = this.ParseNumber("5") } else if IsTrue(IsEqual(base, "ETH")) { amountPrecision = this.ParseNumber("0.1") pricePrecision = this.ParseNumber("0.1") } else if IsTrue(IsEqual(base, "SOL")) { amountPrecision = this.ParseNumber("1") pricePrecision = this.ParseNumber("0.01") } return map[string]interface{} { "id": Add(Add(Add(Add(Add(Add(base, "-"), this.ConvertExpireDateToMarketIdDate(expiry)), "-"), strike), "-"), optionType), "symbol": Add(Add(Add(Add(Add(Add(Add(Add(Add(Add(base, "/"), quote), ":"), settle), "-"), expiry), "-"), strike), "-"), optionType), "base": base, "quote": quote, "settle": settle, "baseId": base, "quoteId": quote, "settleId": settle, "active": false, "type": "option", "linear": nil, "inverse": nil, "spot": false, "swap": false, "future": false, "option": true, "margin": false, "contract": true, "contractSize": this.ParseNumber("1"), "expiry": timestamp, "expiryDatetime": datetime, "optionType": Ternary(IsTrue((IsEqual(optionType, "C"))), "call", "put"), "strike": this.ParseNumber(strike), "precision": map[string]interface{} { "amount": amountPrecision, "price": pricePrecision, }, "limits": map[string]interface{} { "amount": map[string]interface{} { "min": nil, "max": nil, }, "price": map[string]interface{} { "min": nil, "max": nil, }, "cost": map[string]interface{} { "min": nil, "max": nil, }, }, "info": nil, } } func (this *bybit) SafeMarket(optionalArgs ...interface{}) interface{} { marketId := GetArg(optionalArgs, 0, nil) _ = marketId market := GetArg(optionalArgs, 1, nil) _ = market delimiter := GetArg(optionalArgs, 2, nil) _ = delimiter marketType := GetArg(optionalArgs, 3, nil) _ = marketType var isOption interface{} = IsTrue((!IsEqual(marketId, nil))) && IsTrue((IsTrue((IsGreaterThan(GetIndexOf(marketId, "-C"), OpNeg(1)))) || IsTrue((IsGreaterThan(GetIndexOf(marketId, "-P"), OpNeg(1)))))) if IsTrue(IsTrue(isOption) && !IsTrue((InOp(this.Markets_by_id, marketId)))) { // handle expired option contracts return this.CreateExpiredOptionMarket(marketId) } return this.Exchange.SafeMarket(marketId, market, delimiter, marketType) } func (this *bybit) GetBybitType(method interface{}, market interface{}, optionalArgs ...interface{}) interface{} { params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params var typeVar interface{} = nil typeVarparamsVariable := this.HandleMarketTypeAndParams(method, market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) var subType interface{} = nil subTypeparamsVariable := this.HandleSubTypeAndParams(method, market, params); subType = GetValue(subTypeparamsVariable,0); params = GetValue(subTypeparamsVariable,1) if IsTrue(IsTrue(IsEqual(typeVar, "option")) || IsTrue(IsEqual(typeVar, "spot"))) { return []interface{}{typeVar, params} } return []interface{}{subType, params} } func (this *bybit) GetAmount(symbol interface{}, amount interface{}) interface{} { // some markets like options might not have the precision available // and we shouldn't crash in those cases var market interface{} = this.Market(symbol) var emptyPrecisionAmount interface{} = (IsEqual(GetValue(GetValue(market, "precision"), "amount"), nil)) var amountString interface{} = this.NumberToString(amount) if IsTrue(!IsTrue(emptyPrecisionAmount) && IsTrue((!IsEqual(amountString, "0")))) { return this.AmountToPrecision(symbol, amount) } return amountString } func (this *bybit) GetPrice(symbol interface{}, price interface{}) interface{} { if IsTrue(IsEqual(price, nil)) { return price } var market interface{} = this.Market(symbol) var emptyPrecisionPrice interface{} = (IsEqual(GetValue(GetValue(market, "precision"), "price"), nil)) if !IsTrue(emptyPrecisionPrice) { return this.PriceToPrecision(symbol, price) } return price } func (this *bybit) GetCost(symbol interface{}, cost interface{}) interface{} { var market interface{} = this.Market(symbol) var emptyPrecisionPrice interface{} = (IsEqual(GetValue(GetValue(market, "precision"), "price"), nil)) if !IsTrue(emptyPrecisionPrice) { return this.CostToPrecision(symbol, cost) } return cost } /** * @method * @name bybit#fetchTime * @description fetches the current integer timestamp in milliseconds from the exchange server * @see https://bybit-exchange.github.io/docs/v5/market/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 *bybit) FetchTime(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params response:= (<-this.PublicGetV5MarketTime(params)) PanicOnError(response) // // { // "retCode": "0", // "retMsg": "OK", // "result": { // "timeSecond": "1666879482", // "timeNano": "1666879482792685914" // }, // "retExtInfo": {}, // "time": "1666879482792" // } // ch <- this.SafeInteger(response, "time") return nil }() return ch } /** * @method * @name bybit#fetchCurrencies * @description fetches all available currencies on an exchange * @see https://bybit-exchange.github.io/docs/v5/asset/coin-info * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} an associative dictionary of currencies */ func (this *bybit) FetchCurrencies(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params if !IsTrue(this.CheckRequiredCredentials(false)) { return nil } if IsTrue(GetValue(this.Options, "enableDemoTrading")) { return nil } response:= (<-this.PrivateGetV5AssetCoinQueryInfo(params)) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "", // "result": { // "rows": [ // { // "name": "BTC", // "coin": "BTC", // "remainAmount": "150", // "chains": [ // { // "chainType": "BTC", // "confirmation": "10000", // "withdrawFee": "0.0005", // "depositMin": "0.0005", // "withdrawMin": "0.001", // "chain": "BTC", // "chainDeposit": "1", // "chainWithdraw": "1", // "minAccuracy": "8" // } // ] // } // ] // }, // "retExtInfo": {}, // "time": 1672194582264 // } // var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var rows interface{} = this.SafeList(data, "rows", []interface{}{}) var result interface{} = map[string]interface{} {} for i := 0; IsLessThan(i, GetArrayLength(rows)); i++ { var currency interface{} = GetValue(rows, i) var currencyId interface{} = this.SafeString(currency, "coin") var code interface{} = this.SafeCurrencyCode(currencyId) var name interface{} = this.SafeString(currency, "name") var chains interface{} = this.SafeList(currency, "chains", []interface{}{}) var networks interface{} = map[string]interface{} {} var minPrecision interface{} = nil var minWithdrawFeeString interface{} = nil var minWithdrawString interface{} = nil var minDepositString interface{} = nil var deposit interface{} = false var withdraw interface{} = false for j := 0; IsLessThan(j, GetArrayLength(chains)); j++ { var chain interface{} = GetValue(chains, j) var networkId interface{} = this.SafeString(chain, "chain") var networkCode interface{} = this.NetworkIdToCode(networkId) var precision interface{} = this.ParseNumber(this.ParsePrecision(this.SafeString(chain, "minAccuracy"))) minPrecision = Ternary(IsTrue((IsEqual(minPrecision, nil))), precision, mathMin(minPrecision, precision)) var depositAllowed interface{} = IsEqual(this.SafeInteger(chain, "chainDeposit"), 1) deposit = Ternary(IsTrue((depositAllowed)), depositAllowed, deposit) var withdrawAllowed interface{} = IsEqual(this.SafeInteger(chain, "chainWithdraw"), 1) withdraw = Ternary(IsTrue((withdrawAllowed)), withdrawAllowed, withdraw) var withdrawFeeString interface{} = this.SafeString(chain, "withdrawFee") if IsTrue(!IsEqual(withdrawFeeString, nil)) { minWithdrawFeeString = Ternary(IsTrue((IsEqual(minWithdrawFeeString, nil))), withdrawFeeString, Precise.StringMin(withdrawFeeString, minWithdrawFeeString)) } var minNetworkWithdrawString interface{} = this.SafeString(chain, "withdrawMin") if IsTrue(!IsEqual(minNetworkWithdrawString, nil)) { minWithdrawString = Ternary(IsTrue((IsEqual(minWithdrawString, nil))), minNetworkWithdrawString, Precise.StringMin(minNetworkWithdrawString, minWithdrawString)) } var minNetworkDepositString interface{} = this.SafeString(chain, "depositMin") if IsTrue(!IsEqual(minNetworkDepositString, nil)) { minDepositString = Ternary(IsTrue((IsEqual(minDepositString, nil))), minNetworkDepositString, Precise.StringMin(minNetworkDepositString, minDepositString)) } AddElementToObject(networks, networkCode, map[string]interface{} { "info": chain, "id": networkId, "network": networkCode, "active": IsTrue(depositAllowed) && IsTrue(withdrawAllowed), "deposit": depositAllowed, "withdraw": withdrawAllowed, "fee": this.ParseNumber(withdrawFeeString), "precision": precision, "limits": map[string]interface{} { "withdraw": map[string]interface{} { "min": this.ParseNumber(minNetworkWithdrawString), "max": nil, }, "deposit": map[string]interface{} { "min": this.ParseNumber(minNetworkDepositString), "max": nil, }, }, }) } AddElementToObject(result, code, map[string]interface{} { "info": currency, "code": code, "id": currencyId, "name": name, "active": IsTrue(deposit) && IsTrue(withdraw), "deposit": deposit, "withdraw": withdraw, "fee": this.ParseNumber(minWithdrawFeeString), "precision": minPrecision, "limits": map[string]interface{} { "amount": map[string]interface{} { "min": nil, "max": nil, }, "withdraw": map[string]interface{} { "min": this.ParseNumber(minWithdrawString), "max": nil, }, "deposit": map[string]interface{} { "min": this.ParseNumber(minDepositString), "max": nil, }, }, "networks": networks, }) } ch <- result return nil }() return ch } /** * @method * @name bybit#fetchMarkets * @description retrieves data on all markets for bybit * @see https://bybit-exchange.github.io/docs/v5/market/instrument * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object[]} an array of objects representing market data */ func (this *bybit) 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")) { retRes173712 := (<-this.LoadTimeDifference()) PanicOnError(retRes173712) } var promisesUnresolved interface{} = []interface{}{} var fetchMarkets interface{} = this.SafeList(this.Options, "fetchMarkets", []interface{}{"spot", "linear", "inverse"}) for i := 0; IsLessThan(i, GetArrayLength(fetchMarkets)); i++ { var marketType interface{} = GetValue(fetchMarkets, i) if IsTrue(IsEqual(marketType, "spot")) { AppendToArray(&promisesUnresolved,this.FetchSpotMarkets(params)) } else if IsTrue(IsEqual(marketType, "linear")) { AppendToArray(&promisesUnresolved,this.FetchFutureMarkets(map[string]interface{} { "category": "linear", })) } else if IsTrue(IsEqual(marketType, "inverse")) { AppendToArray(&promisesUnresolved,this.FetchFutureMarkets(map[string]interface{} { "category": "inverse", })) } else if IsTrue(IsEqual(marketType, "option")) { AppendToArray(&promisesUnresolved,this.FetchOptionMarkets(map[string]interface{} { "baseCoin": "BTC", })) AppendToArray(&promisesUnresolved,this.FetchOptionMarkets(map[string]interface{} { "baseCoin": "ETH", })) AppendToArray(&promisesUnresolved,this.FetchOptionMarkets(map[string]interface{} { "baseCoin": "SOL", })) } else { panic(ExchangeError(Add(Add(Add(this.Id, " fetchMarkets() this.options fetchMarkets \""), marketType), "\" is not a supported market type"))) } } promises:= (<-promiseAll(promisesUnresolved)) PanicOnError(promises) var spotMarkets interface{} = this.SafeList(promises, 0, []interface{}{}) var linearMarkets interface{} = this.SafeList(promises, 1, []interface{}{}) var inverseMarkets interface{} = this.SafeList(promises, 2, []interface{}{}) var btcOptionMarkets interface{} = this.SafeList(promises, 3, []interface{}{}) var ethOptionMarkets interface{} = this.SafeList(promises, 4, []interface{}{}) var solOptionMarkets interface{} = this.SafeList(promises, 5, []interface{}{}) var futureMarkets interface{} = this.ArrayConcat(linearMarkets, inverseMarkets) var optionMarkets interface{} = this.ArrayConcat(btcOptionMarkets, ethOptionMarkets) optionMarkets = this.ArrayConcat(optionMarkets, solOptionMarkets) var derivativeMarkets interface{} = this.ArrayConcat(futureMarkets, optionMarkets) ch <- this.ArrayConcat(spotMarkets, derivativeMarkets) return nil }() return ch } func (this *bybit) FetchSpotMarkets(params interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) var request interface{} = map[string]interface{} { "category": "spot", } var usePrivateInstrumentsInfo interface{} = this.SafeBool(this.Options, "usePrivateInstrumentsInfo", false) var response interface{} = nil if IsTrue(usePrivateInstrumentsInfo) { response = (<-this.PrivateGetV5MarketInstrumentsInfo(this.Extend(request, params))) PanicOnError(response) } else { response = (<-this.PublicGetV5MarketInstrumentsInfo(this.Extend(request, params))) PanicOnError(response) } // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "category": "spot", // "list": [ // { // "symbol": "BTCUSDT", // "baseCoin": "BTC", // "quoteCoin": "USDT", // "innovation": "0", // "status": "Trading", // "marginTrading": "both", // "lotSizeFilter": { // "basePrecision": "0.000001", // "quotePrecision": "0.00000001", // "minOrderQty": "0.00004", // "maxOrderQty": "63.01197227", // "minOrderAmt": "1", // "maxOrderAmt": "100000" // }, // "priceFilter": { // "tickSize": "0.01" // } // } // ] // }, // "retExtInfo": {}, // "time": 1672712468011 // } // var responseResult interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var markets interface{} = this.SafeList(responseResult, "list", []interface{}{}) var result interface{} = []interface{}{} var takerFee interface{} = this.ParseNumber("0.001") var makerFee interface{} = this.ParseNumber("0.001") for i := 0; IsLessThan(i, GetArrayLength(markets)); i++ { var market interface{} = GetValue(markets, i) var id interface{} = this.SafeString(market, "symbol") var baseId interface{} = this.SafeString(market, "baseCoin") var quoteId interface{} = this.SafeString(market, "quoteCoin") var base interface{} = this.SafeCurrencyCode(baseId) var quote interface{} = this.SafeCurrencyCode(quoteId) var symbol interface{} = Add(Add(base, "/"), quote) var status interface{} = this.SafeString(market, "status") var active interface{} = (IsEqual(status, "Trading")) var lotSizeFilter interface{} = this.SafeDict(market, "lotSizeFilter") var priceFilter interface{} = this.SafeDict(market, "priceFilter") var quotePrecision interface{} = this.SafeNumber(lotSizeFilter, "quotePrecision") var marginTrading interface{} = this.SafeString(market, "marginTrading", "none") var allowsMargin interface{} = !IsEqual(marginTrading, "none") AppendToArray(&result,this.SafeMarketStructure(map[string]interface{} { "id": id, "symbol": symbol, "base": base, "quote": quote, "settle": nil, "baseId": baseId, "quoteId": quoteId, "settleId": nil, "type": "spot", "spot": true, "margin": allowsMargin, "swap": false, "future": false, "option": false, "active": active, "contract": false, "linear": nil, "inverse": nil, "taker": takerFee, "maker": makerFee, "contractSize": nil, "expiry": nil, "expiryDatetime": nil, "strike": nil, "optionType": nil, "precision": map[string]interface{} { "amount": this.SafeNumber(lotSizeFilter, "basePrecision"), "price": this.SafeNumber(priceFilter, "tickSize", quotePrecision), }, "limits": map[string]interface{} { "leverage": map[string]interface{} { "min": this.ParseNumber("1"), "max": nil, }, "amount": map[string]interface{} { "min": this.SafeNumber(lotSizeFilter, "minOrderQty"), "max": this.SafeNumber(lotSizeFilter, "maxOrderQty"), }, "price": map[string]interface{} { "min": nil, "max": nil, }, "cost": map[string]interface{} { "min": this.SafeNumber(lotSizeFilter, "minOrderAmt"), "max": this.SafeNumber(lotSizeFilter, "maxOrderAmt"), }, }, "created": nil, "info": market, })) } ch <- result return nil }() return ch } func (this *bybit) FetchFutureMarkets(params interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params = this.Extend(params) AddElementToObject(params, "limit", 1000) // minimize number of requests var preLaunchMarkets interface{} = []interface{}{} var usePrivateInstrumentsInfo interface{} = this.SafeBool(this.Options, "usePrivateInstrumentsInfo", false) var response interface{} = nil if IsTrue(usePrivateInstrumentsInfo) { response = (<-this.PrivateGetV5MarketInstrumentsInfo(params)) PanicOnError(response) } else { var linearPromises interface{} = []interface{}{this.PublicGetV5MarketInstrumentsInfo(params), this.PublicGetV5MarketInstrumentsInfo(this.Extend(params, map[string]interface{} { "status": "PreLaunch", }))} promises:= (<-promiseAll(linearPromises)) PanicOnError(promises) response = this.SafeDict(promises, 0, map[string]interface{} {}) preLaunchMarkets = this.SafeDict(promises, 1, map[string]interface{} {}) } var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var markets interface{} = this.SafeList(data, "list", []interface{}{}) var paginationCursor interface{} = this.SafeString(data, "nextPageCursor") if IsTrue(!IsEqual(paginationCursor, nil)) { for !IsEqual(paginationCursor, nil) { AddElementToObject(params, "cursor", paginationCursor) var responseInner interface{} = nil if IsTrue(usePrivateInstrumentsInfo) { responseInner = (<-this.PrivateGetV5MarketInstrumentsInfo(params)) PanicOnError(responseInner) } else { responseInner = (<-this.PublicGetV5MarketInstrumentsInfo(params)) PanicOnError(responseInner) } var dataNew interface{} = this.SafeDict(responseInner, "result", map[string]interface{} {}) var rawMarkets interface{} = this.SafeList(dataNew, "list", []interface{}{}) var rawMarketsLength interface{} = GetArrayLength(rawMarkets) if IsTrue(IsEqual(rawMarketsLength, 0)) { break } markets = this.ArrayConcat(rawMarkets, markets) paginationCursor = this.SafeString(dataNew, "nextPageCursor") } } // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "category": "linear", // "list": [ // { // "symbol": "BTCUSDT", // "contractType": "LinearPerpetual", // "status": "Trading", // "baseCoin": "BTC", // "quoteCoin": "USDT", // "launchTime": "1585526400000", // "deliveryTime": "0", // "deliveryFeeRate": "", // "priceScale": "2", // "leverageFilter": { // "minLeverage": "1", // "maxLeverage": "100.00", // "leverageStep": "0.01" // }, // "priceFilter": { // "minPrice": "0.50", // "maxPrice": "999999.00", // "tickSize": "0.50" // }, // "lotSizeFilter": { // "maxOrderQty": "100.000", // "minOrderQty": "0.001", // "qtyStep": "0.001", // "postOnlyMaxOrderQty": "1000.000" // }, // "unifiedMarginTrade": true, // "fundingInterval": 480, // "settleCoin": "USDT" // } // ], // "nextPageCursor": "" // }, // "retExtInfo": {}, // "time": 1672712495660 // } // var preLaunchData interface{} = this.SafeDict(preLaunchMarkets, "result", map[string]interface{} {}) var preLaunchMarketsList interface{} = this.SafeList(preLaunchData, "list", []interface{}{}) markets = this.ArrayConcat(markets, preLaunchMarketsList) var result interface{} = []interface{}{} var category interface{} = this.SafeString(data, "category") for i := 0; IsLessThan(i, GetArrayLength(markets)); i++ { var market interface{} = GetValue(markets, i) if IsTrue(IsEqual(category, nil)) { category = this.SafeString(market, "category") } var linear interface{} = (IsEqual(category, "linear")) var inverse interface{} = (IsEqual(category, "inverse")) var contractType interface{} = this.SafeString(market, "contractType") var inverseFutures interface{} = (IsEqual(contractType, "InverseFutures")) var linearFutures interface{} = (IsEqual(contractType, "LinearFutures")) var linearPerpetual interface{} = (IsEqual(contractType, "LinearPerpetual")) var inversePerpetual interface{} = (IsEqual(contractType, "InversePerpetual")) var id interface{} = this.SafeString(market, "symbol") var baseId interface{} = this.SafeString(market, "baseCoin") var quoteId interface{} = this.SafeString(market, "quoteCoin") var defaultSettledId interface{} = Ternary(IsTrue(linear), quoteId, baseId) var settleId interface{} = this.SafeString(market, "settleCoin", defaultSettledId) var base interface{} = this.SafeCurrencyCode(baseId) var quote interface{} = this.SafeCurrencyCode(quoteId) var settle interface{} = nil if IsTrue(IsTrue(linearPerpetual) && IsTrue((IsEqual(settleId, "USD")))) { settle = "USDC" } else { settle = this.SafeCurrencyCode(settleId) } var symbol interface{} = Add(Add(base, "/"), quote) var lotSizeFilter interface{} = this.SafeDict(market, "lotSizeFilter", map[string]interface{} {}) var priceFilter interface{} = this.SafeDict(market, "priceFilter", map[string]interface{} {}) var leverage interface{} = this.SafeDict(market, "leverageFilter", map[string]interface{} {}) var status interface{} = this.SafeString(market, "status") var swap interface{} = IsTrue(linearPerpetual) || IsTrue(inversePerpetual) var future interface{} = IsTrue(inverseFutures) || IsTrue(linearFutures) var typeVar interface{} = nil if IsTrue(swap) { typeVar = "swap" } else if IsTrue(future) { typeVar = "future" } var expiry interface{} = nil // some swaps have deliveryTime meaning delisting time if !IsTrue(swap) { expiry = this.OmitZero(this.SafeString(market, "deliveryTime")) if IsTrue(!IsEqual(expiry, nil)) { expiry = ParseInt(expiry) } } var expiryDatetime interface{} = this.Iso8601(expiry) symbol = Add(Add(symbol, ":"), settle) if IsTrue(!IsEqual(expiry, nil)) { symbol = Add(Add(symbol, "-"), this.Yymmdd(expiry)) } var contractSize interface{} = Ternary(IsTrue(inverse), this.SafeNumber2(lotSizeFilter, "minTradingQty", "minOrderQty"), this.ParseNumber("1")) AppendToArray(&result,this.SafeMarketStructure(map[string]interface{} { "id": id, "symbol": symbol, "base": base, "quote": quote, "settle": settle, "baseId": baseId, "quoteId": quoteId, "settleId": settleId, "type": typeVar, "spot": false, "margin": nil, "swap": swap, "future": future, "option": false, "active": (IsEqual(status, "Trading")), "contract": true, "linear": linear, "inverse": inverse, "taker": this.SafeNumber(market, "takerFee", this.ParseNumber("0.0006")), "maker": this.SafeNumber(market, "makerFee", this.ParseNumber("0.0001")), "contractSize": contractSize, "expiry": expiry, "expiryDatetime": expiryDatetime, "strike": nil, "optionType": nil, "precision": map[string]interface{} { "amount": this.SafeNumber(lotSizeFilter, "qtyStep"), "price": this.SafeNumber(priceFilter, "tickSize"), }, "limits": map[string]interface{} { "leverage": map[string]interface{} { "min": this.SafeNumber(leverage, "minLeverage"), "max": this.SafeNumber(leverage, "maxLeverage"), }, "amount": map[string]interface{} { "min": this.SafeNumber2(lotSizeFilter, "minTradingQty", "minOrderQty"), "max": this.SafeNumber2(lotSizeFilter, "maxTradingQty", "maxOrderQty"), }, "price": map[string]interface{} { "min": this.SafeNumber(priceFilter, "minPrice"), "max": this.SafeNumber(priceFilter, "maxPrice"), }, "cost": map[string]interface{} { "min": nil, "max": nil, }, }, "created": this.SafeInteger(market, "launchTime"), "info": market, })) } ch <- result return nil }() return ch } func (this *bybit) FetchOptionMarkets(params interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) var request interface{} = map[string]interface{} { "category": "option", } var usePrivateInstrumentsInfo interface{} = this.SafeBool(this.Options, "usePrivateInstrumentsInfo", false) var response interface{} = nil if IsTrue(usePrivateInstrumentsInfo) { response = (<-this.PrivateGetV5MarketInstrumentsInfo(this.Extend(request, params))) PanicOnError(response) } else { response = (<-this.PublicGetV5MarketInstrumentsInfo(this.Extend(request, params))) PanicOnError(response) } var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var markets interface{} = this.SafeList(data, "list", []interface{}{}) if IsTrue(GetValue(this.Options, "loadAllOptions")) { AddElementToObject(request, "limit", 1000) var paginationCursor interface{} = this.SafeString(data, "nextPageCursor") if IsTrue(!IsEqual(paginationCursor, nil)) { for !IsEqual(paginationCursor, nil) { AddElementToObject(request, "cursor", paginationCursor) var responseInner interface{} = nil if IsTrue(usePrivateInstrumentsInfo) { responseInner = (<-this.PrivateGetV5MarketInstrumentsInfo(this.Extend(request, params))) PanicOnError(responseInner) } else { responseInner = (<-this.PublicGetV5MarketInstrumentsInfo(this.Extend(request, params))) PanicOnError(responseInner) } var dataNew interface{} = this.SafeDict(responseInner, "result", map[string]interface{} {}) var rawMarkets interface{} = this.SafeList(dataNew, "list", []interface{}{}) var rawMarketsLength interface{} = GetArrayLength(rawMarkets) if IsTrue(IsEqual(rawMarketsLength, 0)) { break } markets = this.ArrayConcat(rawMarkets, markets) paginationCursor = this.SafeString(dataNew, "nextPageCursor") } } } // // { // "retCode": 0, // "retMsg": "success", // "result": { // "category": "option", // "nextPageCursor": "0%2C2", // "list": [ // { // "symbol": "BTC-29DEC23-80000-C", // "status": "Trading", // "baseCoin": "BTC", // "quoteCoin": "USD", // "settleCoin": "USDC", // "optionsType": "Call", // "launchTime": "1688630400000", // "deliveryTime": "1703836800000", // "deliveryFeeRate": "0.00015", // "priceFilter": { // "minPrice": "5", // "maxPrice": "10000000", // "tickSize": "5" // }, // "lotSizeFilter": { // "maxOrderQty": "500", // "minOrderQty": "0.01", // "qtyStep": "0.01" // } // }, // ] // }, // "retExtInfo": {}, // "time": 1688873094448 // } // var result interface{} = []interface{}{} for i := 0; IsLessThan(i, GetArrayLength(markets)); i++ { var market interface{} = GetValue(markets, 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 lotSizeFilter interface{} = this.SafeDict(market, "lotSizeFilter", map[string]interface{} {}) var priceFilter interface{} = this.SafeDict(market, "priceFilter", map[string]interface{} {}) var status interface{} = this.SafeString(market, "status") var expiry interface{} = this.SafeInteger(market, "deliveryTime") var splitId interface{} = Split(id, "-") var strike interface{} = this.SafeString(splitId, 2) var optionLetter interface{} = this.SafeString(splitId, 3) var isActive interface{} = (IsEqual(status, "Trading")) if IsTrue(IsTrue(IsTrue(isActive) || IsTrue((GetValue(this.Options, "loadAllOptions")))) || IsTrue((GetValue(this.Options, "loadExpiredOptions")))) { AppendToArray(&result,this.SafeMarketStructure(map[string]interface{} { "id": id, "symbol": Add(Add(Add(Add(Add(Add(Add(Add(Add(Add(base, "/"), quote), ":"), settle), "-"), this.Yymmdd(expiry)), "-"), strike), "-"), optionLetter), "base": base, "quote": quote, "settle": settle, "baseId": baseId, "quoteId": quoteId, "settleId": settleId, "type": "option", "subType": "linear", "spot": false, "margin": false, "swap": false, "future": false, "option": true, "active": isActive, "contract": true, "linear": true, "inverse": false, "taker": this.SafeNumber(market, "takerFee", this.ParseNumber("0.0006")), "maker": this.SafeNumber(market, "makerFee", this.ParseNumber("0.0001")), "contractSize": this.ParseNumber("1"), "expiry": expiry, "expiryDatetime": this.Iso8601(expiry), "strike": this.ParseNumber(strike), "optionType": this.SafeStringLower(market, "optionsType"), "precision": map[string]interface{} { "amount": this.SafeNumber(lotSizeFilter, "qtyStep"), "price": this.SafeNumber(priceFilter, "tickSize"), }, "limits": map[string]interface{} { "leverage": map[string]interface{} { "min": nil, "max": nil, }, "amount": map[string]interface{} { "min": this.SafeNumber(lotSizeFilter, "minOrderQty"), "max": this.SafeNumber(lotSizeFilter, "maxOrderQty"), }, "price": map[string]interface{} { "min": this.SafeNumber(priceFilter, "minPrice"), "max": this.SafeNumber(priceFilter, "maxPrice"), }, "cost": map[string]interface{} { "min": nil, "max": nil, }, }, "created": this.SafeInteger(market, "launchTime"), "info": market, })) } } ch <- result return nil }() return ch } func (this *bybit) ParseTicker(ticker interface{}, optionalArgs ...interface{}) interface{} { // // spot // // { // "symbol": "BTCUSDT", // "bid1Price": "20517.96", // "bid1Size": "2", // "ask1Price": "20527.77", // "ask1Size": "1.862172", // "lastPrice": "20533.13", // "prevPrice24h": "20393.48", // "price24hPcnt": "0.0068", // "highPrice24h": "21128.12", // "lowPrice24h": "20318.89", // "turnover24h": "243765620.65899866", // "volume24h": "11801.27771", // "usdIndexPrice": "20784.12009279" // } // // linear/inverse // // { // "symbol": "BTCUSD", // "lastPrice": "16597.00", // "indexPrice": "16598.54", // "markPrice": "16596.00", // "prevPrice24h": "16464.50", // "price24hPcnt": "0.008047", // "highPrice24h": "30912.50", // "lowPrice24h": "15700.00", // "prevPrice1h": "16595.50", // "openInterest": "373504107", // "openInterestValue": "22505.67", // "turnover24h": "2352.94950046", // "volume24h": "49337318", // "fundingRate": "-0.001034", // "nextFundingTime": "1672387200000", // "predictedDeliveryPrice": "", // "basisRate": "", // "deliveryFeeRate": "", // "deliveryTime": "0", // "ask1Size": "1", // "bid1Price": "16596.00", // "ask1Price": "16597.50", // "bid1Size": "1" // } // // option // // { // "symbol": "BTC-30DEC22-18000-C", // "bid1Price": "0", // "bid1Size": "0", // "bid1Iv": "0", // "ask1Price": "435", // "ask1Size": "0.66", // "ask1Iv": "5", // "lastPrice": "435", // "highPrice24h": "435", // "lowPrice24h": "165", // "markPrice": "0.00000009", // "indexPrice": "16600.55", // "markIv": "0.7567", // "underlyingPrice": "16590.42", // "openInterest": "6.3", // "turnover24h": "2482.73", // "volume24h": "0.15", // "totalVolume": "99", // "totalTurnover": "1967653", // "delta": "0.00000001", // "gamma": "0.00000001", // "vega": "0.00000004", // "theta": "-0.00000152", // "predictedDeliveryPrice": "0", // "change24h": "86" // } // market := GetArg(optionalArgs, 0, nil) _ = market var isSpot interface{} = IsEqual(this.SafeString(ticker, "openInterestValue"), nil) var timestamp interface{} = this.SafeInteger(ticker, "time") var marketId interface{} = this.SafeString(ticker, "symbol") var typeVar interface{} = Ternary(IsTrue(isSpot), "spot", "contract") market = this.SafeMarket(marketId, market, nil, typeVar) var symbol interface{} = this.SafeSymbol(marketId, market, nil, typeVar) var last interface{} = this.SafeString(ticker, "lastPrice") var open interface{} = this.SafeString(ticker, "prevPrice24h") var percentage interface{} = this.SafeString(ticker, "price24hPcnt") percentage = Precise.StringMul(percentage, "100") var quoteVolume interface{} = this.SafeString(ticker, "turnover24h") var baseVolume interface{} = this.SafeString(ticker, "volume24h") var bid interface{} = this.SafeString(ticker, "bid1Price") var ask interface{} = this.SafeString(ticker, "ask1Price") var high interface{} = this.SafeString(ticker, "highPrice24h") var low interface{} = this.SafeString(ticker, "lowPrice24h") return this.SafeTicker(map[string]interface{} { "symbol": symbol, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "high": high, "low": low, "bid": bid, "bidVolume": this.SafeString2(ticker, "bidSize", "bid1Size"), "ask": ask, "askVolume": this.SafeString2(ticker, "askSize", "ask1Size"), "vwap": nil, "open": open, "close": last, "last": last, "previousClose": nil, "change": nil, "percentage": percentage, "average": nil, "baseVolume": baseVolume, "quoteVolume": quoteVolume, "markPrice": this.SafeString(ticker, "markPrice"), "indexPrice": this.SafeString(ticker, "indexPrice"), "info": ticker, }, market) } /** * @method * @name bybit#fetchTicker * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market * @see https://bybit-exchange.github.io/docs/v5/market/tickers * @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 *bybit) 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 if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " fetchTicker() requires a symbol argument"))) } retRes23648 := (<-this.LoadMarkets()) PanicOnError(retRes23648) var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } if IsTrue(GetValue(market, "spot")) { AddElementToObject(request, "category", "spot") } else { if IsTrue(GetValue(market, "option")) { AddElementToObject(request, "category", "option") } else if IsTrue(GetValue(market, "linear")) { AddElementToObject(request, "category", "linear") } else if IsTrue(GetValue(market, "inverse")) { AddElementToObject(request, "category", "inverse") } } response:= (<-this.PublicGetV5MarketTickers(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "category": "inverse", // "list": [ // { // "symbol": "BTCUSD", // "lastPrice": "16597.00", // "indexPrice": "16598.54", // "markPrice": "16596.00", // "prevPrice24h": "16464.50", // "price24hPcnt": "0.008047", // "highPrice24h": "30912.50", // "lowPrice24h": "15700.00", // "prevPrice1h": "16595.50", // "openInterest": "373504107", // "openInterestValue": "22505.67", // "turnover24h": "2352.94950046", // "volume24h": "49337318", // "fundingRate": "-0.001034", // "nextFundingTime": "1672387200000", // "predictedDeliveryPrice": "", // "basisRate": "", // "deliveryFeeRate": "", // "deliveryTime": "0", // "ask1Size": "1", // "bid1Price": "16596.00", // "ask1Price": "16597.50", // "bid1Size": "1" // } // ] // }, // "retExtInfo": {}, // "time": 1672376496682 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var tickers interface{} = this.SafeList(result, "list", []interface{}{}) var rawTicker interface{} = this.SafeDict(tickers, 0) ch <- this.ParseTicker(rawTicker, market) return nil }() return ch } /** * @method * @name bybit#fetchTickers * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market * @see https://bybit-exchange.github.io/docs/v5/market/tickers * @param {string[]} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.subType] *contract only* 'linear', 'inverse' * @param {string} [params.baseCoin] *option only* base coin, default is 'BTC' * @returns {object} an array of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure} */ func (this *bybit) 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 retRes24398 := (<-this.LoadMarkets()) PanicOnError(retRes24398) var market interface{} = nil var parsedSymbols interface{} = nil if IsTrue(!IsEqual(symbols, nil)) { parsedSymbols = []interface{}{} var marketTypeInfo interface{} = this.HandleMarketTypeAndParams("fetchTickers", nil, params) var defaultType interface{} = GetValue(marketTypeInfo, 0) // don't omit here // we can't use marketSymbols here due to the conflicing ids between markets var currentType interface{} = nil for i := 0; IsLessThan(i, GetArrayLength(symbols)); i++ { var symbol interface{} = GetValue(symbols, i) // using safeMarket here because if the user provides for instance BTCUSDT and "type": "spot" in params we should // infer the market type from the type provided and not from the conflicting id (BTCUSDT might be swap or spot) var isExchangeSpecificSymbol interface{} = (IsEqual(GetIndexOf(symbol, "/"), OpNeg(1))) if IsTrue(isExchangeSpecificSymbol) { market = this.SafeMarket(symbol, nil, nil, defaultType) } else { market = this.Market(symbol) } if IsTrue(IsEqual(currentType, nil)) { currentType = GetValue(market, "type") } else if IsTrue(!IsEqual(GetValue(market, "type"), currentType)) { panic(BadRequest(Add(this.Id, " fetchTickers can only accept a list of symbols of the same type"))) } AppendToArray(&parsedSymbols,GetValue(market, "symbol")) } } var request interface{} = map[string]interface{} {} var typeVar interface{} = nil typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchTickers", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) // Calls like `.fetchTickers (undefined, {subType:'inverse'})` should be supported for this exchange, so // as "options.defaultSubType" is also set in exchange options, we should consider `params.subType` // with higher priority and only default to spot, if `subType` is not set in params var passedSubType interface{} = this.SafeString(params, "subType") var subType interface{} = nil subTypeparamsVariable := this.HandleSubTypeAndParams("fetchTickers", market, params, "linear"); subType = GetValue(subTypeparamsVariable,0); params = GetValue(subTypeparamsVariable,1) // only if passedSubType is undefined, then use spot if IsTrue(IsTrue(IsEqual(typeVar, "spot")) && IsTrue(IsEqual(passedSubType, nil))) { AddElementToObject(request, "category", "spot") } else if IsTrue(IsEqual(typeVar, "option")) { AddElementToObject(request, "category", "option") AddElementToObject(request, "baseCoin", this.SafeString(params, "baseCoin", "BTC")) } else if IsTrue(IsTrue(IsTrue(IsEqual(typeVar, "swap")) || IsTrue(IsEqual(typeVar, "future"))) || IsTrue(!IsEqual(subType, nil))) { AddElementToObject(request, "category", subType) } response:= (<-this.PublicGetV5MarketTickers(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "category": "inverse", // "list": [ // { // "symbol": "BTCUSD", // "lastPrice": "16597.00", // "indexPrice": "16598.54", // "markPrice": "16596.00", // "prevPrice24h": "16464.50", // "price24hPcnt": "0.008047", // "highPrice24h": "30912.50", // "lowPrice24h": "15700.00", // "prevPrice1h": "16595.50", // "openInterest": "373504107", // "openInterestValue": "22505.67", // "turnover24h": "2352.94950046", // "volume24h": "49337318", // "fundingRate": "-0.001034", // "nextFundingTime": "1672387200000", // "predictedDeliveryPrice": "", // "basisRate": "", // "deliveryFeeRate": "", // "deliveryTime": "0", // "ask1Size": "1", // "bid1Price": "16596.00", // "ask1Price": "16597.50", // "bid1Size": "1" // } // ] // }, // "retExtInfo": {}, // "time": 1672376496682 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var tickerList interface{} = this.SafeList(result, "list", []interface{}{}) ch <- this.ParseTickers(tickerList, parsedSymbols) return nil }() return ch } /** * @method * @name bybit#fetchBidsAsks * @description fetches the bid and ask price and volume for multiple markets * @see https://bybit-exchange.github.io/docs/v5/market/tickers * @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 * @param {string} [params.subType] *contract only* 'linear', 'inverse' * @param {string} [params.baseCoin] *option only* base coin, default is 'BTC' * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure} */ func (this *bybit) 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 retRes254415 := (<-this.FetchTickers(symbols, params)) PanicOnError(retRes254415) ch <- retRes254415 return nil }() return ch } func (this *bybit) ParseOHLCV(ohlcv interface{}, optionalArgs ...interface{}) interface{} { // // [ // "1621162800", // "49592.43", // "49644.91", // "49342.37", // "49349.42", // "1451.59", // "2.4343353100000003" // ] // market := GetArg(optionalArgs, 0, nil) _ = market var volumeIndex interface{} = Ternary(IsTrue((GetValue(market, "inverse"))), 6, 5) 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, volumeIndex)} } /** * @method * @name bybit#fetchOHLCV * @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market * @see https://bybit-exchange.github.io/docs/v5/market/kline * @see https://bybit-exchange.github.io/docs/v5/market/mark-kline * @see https://bybit-exchange.github.io/docs/v5/market/index-kline * @see https://bybit-exchange.github.io/docs/v5/market/preimum-index-kline * @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] the latest time in ms to fetch orders for * @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 *bybit) 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 if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " fetchOHLCV() requires a symbol argument"))) } retRes25918 := (<-this.LoadMarkets()) PanicOnError(retRes25918) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchOHLCV", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes259519 := (<-this.FetchPaginatedCallDeterministic("fetchOHLCV", symbol, since, limit, timeframe, params, 1000)) PanicOnError(retRes259519) ch <- retRes259519 return nil } var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } if IsTrue(IsEqual(limit, nil)) { limit = 200 // default is 200 when requested with `since` } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "start", since) } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) // max 1000, default 1000 } requestparamsVariable := this.HandleUntilOption("end", request, params); request = GetValue(requestparamsVariable,0); params = GetValue(requestparamsVariable,1) AddElementToObject(request, "interval", this.SafeString(this.Timeframes, timeframe, timeframe)) var response interface{} = nil if IsTrue(GetValue(market, "spot")) { AddElementToObject(request, "category", "spot") response = (<-this.PublicGetV5MarketKline(this.Extend(request, params))) PanicOnError(response) } else { var price interface{} = this.SafeString(params, "price") params = this.Omit(params, "price") if IsTrue(GetValue(market, "linear")) { AddElementToObject(request, "category", "linear") } else if IsTrue(GetValue(market, "inverse")) { AddElementToObject(request, "category", "inverse") } else { panic(NotSupported(Add(this.Id, " fetchOHLCV() is not supported for option markets"))) } if IsTrue(IsEqual(price, "mark")) { response = (<-this.PublicGetV5MarketMarkPriceKline(this.Extend(request, params))) PanicOnError(response) } else if IsTrue(IsEqual(price, "index")) { response = (<-this.PublicGetV5MarketIndexPriceKline(this.Extend(request, params))) PanicOnError(response) } else if IsTrue(IsEqual(price, "premiumIndex")) { response = (<-this.PublicGetV5MarketPremiumIndexPriceKline(this.Extend(request, params))) PanicOnError(response) } else { response = (<-this.PublicGetV5MarketKline(this.Extend(request, params))) PanicOnError(response) } } // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "symbol": "BTCUSD", // "category": "inverse", // "list": [ // [ // "1670608800000", // "17071", // "17073", // "17027", // "17055.5", // "268611", // "15.74462667" // ], // [ // "1670605200000", // "17071.5", // "17071.5", // "17061", // "17071", // "4177", // "0.24469757" // ], // [ // "1670601600000", // "17086.5", // "17088", // "16978", // "17071.5", // "6356", // "0.37288112" // ] // ] // }, // "retExtInfo": {}, // "time": 1672025956592 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var ohlcvs interface{} = this.SafeList(result, "list", []interface{}{}) ch <- this.ParseOHLCVs(ohlcvs, market, timeframe, since, limit) return nil }() return ch } func (this *bybit) ParseFundingRate(ticker interface{}, optionalArgs ...interface{}) interface{} { // // { // "symbol": "BTCUSDT", // "bidPrice": "19255", // "askPrice": "19255.5", // "lastPrice": "19255.50", // "lastTickDirection": "ZeroPlusTick", // "prevPrice24h": "18634.50", // "price24hPcnt": "0.033325", // "highPrice24h": "19675.00", // "lowPrice24h": "18610.00", // "prevPrice1h": "19278.00", // "markPrice": "19255.00", // "indexPrice": "19260.68", // "openInterest": "48069.549", // "turnover24h": "4686694853.047006", // "volume24h": "243730.252", // "fundingRate": "0.0001", // "nextFundingTime": "1663689600000", // "predictedDeliveryPrice": "", // "basisRate": "", // "deliveryFeeRate": "", // "deliveryTime": "0" // } // market := GetArg(optionalArgs, 0, nil) _ = market var timestamp interface{} = this.SafeInteger(ticker, "timestamp") // added artificially to avoid changing the signature ticker = this.Omit(ticker, "timestamp") var marketId interface{} = this.SafeString(ticker, "symbol") var symbol interface{} = this.SafeSymbol(marketId, market, nil, "swap") var fundingRate interface{} = this.SafeNumber(ticker, "fundingRate") var fundingTimestamp interface{} = this.SafeInteger(ticker, "nextFundingTime") var markPrice interface{} = this.SafeNumber(ticker, "markPrice") var indexPrice interface{} = this.SafeNumber(ticker, "indexPrice") var info interface{} = this.SafeDict(this.SafeMarket(marketId, market, nil, "swap"), "info") var fundingInterval interface{} = this.SafeInteger(info, "fundingInterval") var intervalString interface{} = nil if IsTrue(!IsEqual(fundingInterval, nil)) { var interval interface{} = this.ParseToInt(Divide(fundingInterval, 60)) intervalString = Add(ToString(interval), "h") } return map[string]interface{} { "info": ticker, "symbol": symbol, "markPrice": markPrice, "indexPrice": indexPrice, "interestRate": nil, "estimatedSettlePrice": nil, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "fundingRate": fundingRate, "fundingTimestamp": fundingTimestamp, "fundingDatetime": this.Iso8601(fundingTimestamp), "nextFundingRate": nil, "nextFundingTimestamp": nil, "nextFundingDatetime": nil, "previousFundingRate": nil, "previousFundingTimestamp": nil, "previousFundingDatetime": nil, "interval": intervalString, } } /** * @method * @name bybit#fetchFundingRates * @description fetches funding rates for multiple markets * @see https://bybit-exchange.github.io/docs/v5/market/tickers * @param {string[]} symbols unified symbols of the markets to fetch the funding rates for, all market funding rates are returned if not assigned * @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-structure} */ func (this *bybit) FetchFundingRates(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbols := GetArg(optionalArgs, 0, nil) _ = symbols params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params retRes27558 := (<-this.LoadMarkets()) PanicOnError(retRes27558) var market interface{} = nil var request interface{} = map[string]interface{} {} if IsTrue(!IsEqual(symbols, nil)) { symbols = this.MarketSymbols(symbols) market = this.Market(GetValue(symbols, 0)) var symbolsLength interface{} = GetArrayLength(symbols) if IsTrue(IsEqual(symbolsLength, 1)) { AddElementToObject(request, "symbol", GetValue(market, "id")) } } var typeVar interface{} = nil typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchFundingRates", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(!IsEqual(typeVar, "swap")) { panic(NotSupported(Add(Add(Add(this.Id, " fetchFundingRates() does not support "), typeVar), " markets"))) } else { var subType interface{} = nil subTypeparamsVariable := this.HandleSubTypeAndParams("fetchFundingRates", market, params, "linear"); subType = GetValue(subTypeparamsVariable,0); params = GetValue(subTypeparamsVariable,1) AddElementToObject(request, "category", subType) } response:= (<-this.PublicGetV5MarketTickers(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "category": "linear", // "list": [ // { // "symbol": "BTCUSDT", // "bidPrice": "19255", // "askPrice": "19255.5", // "lastPrice": "19255.50", // "lastTickDirection": "ZeroPlusTick", // "prevPrice24h": "18634.50", // "price24hPcnt": "0.033325", // "highPrice24h": "19675.00", // "lowPrice24h": "18610.00", // "prevPrice1h": "19278.00", // "markPrice": "19255.00", // "indexPrice": "19260.68", // "openInterest": "48069.549", // "turnover24h": "4686694853.047006", // "volume24h": "243730.252", // "fundingRate": "0.0001", // "nextFundingTime": "1663689600000", // "predictedDeliveryPrice": "", // "basisRate": "", // "deliveryFeeRate": "", // "deliveryTime": "0" // } // ] // }, // "retExtInfo": null, // "time": 1663670053454 // } // var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var tickerList interface{} = this.SafeList(data, "list", []interface{}{}) var timestamp interface{} = this.SafeInteger(response, "time") for i := 0; IsLessThan(i, GetArrayLength(tickerList)); i++ { AddElementToObject(GetValue(tickerList, i), "timestamp", timestamp) // will be removed inside the parser } ch <- this.ParseFundingRates(tickerList, symbols) return nil }() return ch } /** * @method * @name bybit#fetchFundingRateHistory * @description fetches historical funding rate prices * @see https://bybit-exchange.github.io/docs/v5/market/history-fund-rate * @param {string} symbol unified symbol of the market to fetch the funding rate history for * @param {int} [since] timestamp in ms of the earliest funding rate to fetch * @param {int} [limit] the maximum amount of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure} to fetch * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {int} [params.until] timestamp in ms of the latest funding rate * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {object[]} a list of [funding rate structures]{@link https://docs.ccxt.com/#/?id=funding-rate-history-structure} */ func (this *bybit) 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"))) } retRes28388 := (<-this.LoadMarkets()) PanicOnError(retRes28388) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchFundingRateHistory", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes284219 := (<-this.FetchPaginatedCallDeterministic("fetchFundingRateHistory", symbol, since, limit, "8h", params, 200)) PanicOnError(retRes284219) ch <- retRes284219 return nil } if IsTrue(IsEqual(limit, nil)) { limit = 200 } var request interface{} = map[string]interface{} { "limit": limit, } var market interface{} = this.Market(symbol) symbol = GetValue(market, "symbol") AddElementToObject(request, "symbol", GetValue(market, "id")) var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchFundingRateHistory", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "option"))) { panic(NotSupported(Add(this.Id, " fetchFundingRateHistory() only support linear and inverse market"))) } AddElementToObject(request, "category", typeVar) if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } var until interface{} = this.SafeInteger(params, "until") // unified in milliseconds var endTime interface{} = this.SafeInteger(params, "endTime", until) // exchange-specific in milliseconds params = this.Omit(params, []interface{}{"endTime", "until"}) if IsTrue(!IsEqual(endTime, nil)) { AddElementToObject(request, "endTime", endTime) } else { if IsTrue(!IsEqual(since, nil)) { // end time is required when since is not empty var fundingInterval interface{} = Multiply(Multiply(Multiply(60, 60), 8), 1000) AddElementToObject(request, "endTime", Add(since, Multiply(limit, fundingInterval))) } } response:= (<-this.PublicGetV5MarketFundingHistory(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "category": "linear", // "list": [ // { // "symbol": "ETHPERP", // "fundingRate": "0.0001", // "fundingRateTimestamp": "1672041600000" // } // ] // }, // "retExtInfo": {}, // "time": 1672051897447 // } // var rates interface{} = []interface{}{} var result interface{} = this.SafeDict(response, "result") var resultList interface{} = this.SafeList(result, "list") for i := 0; IsLessThan(i, GetArrayLength(resultList)); i++ { var entry interface{} = GetValue(resultList, i) var timestamp interface{} = this.SafeInteger(entry, "fundingRateTimestamp") AppendToArray(&rates,map[string]interface{} { "info": entry, "symbol": this.SafeSymbol(this.SafeString(entry, "symbol"), nil, nil, "swap"), "fundingRate": this.SafeNumber(entry, "fundingRate"), "timestamp": timestamp, "datetime": this.Iso8601(timestamp), }) } var sorted interface{} = this.SortBy(rates, "timestamp") ch <- this.FilterBySymbolSinceLimit(sorted, symbol, since, limit) return nil }() return ch } func (this *bybit) ParseTrade(trade interface{}, optionalArgs ...interface{}) interface{} { // // public https://bybit-exchange.github.io/docs/v5/market/recent-trade // // { // "execId": "666042b4-50c6-58f3-bd9c-89b2088663ff", // "symbol": "ETHUSD", // "price": "1162.95", // "size": "1", // "side": "Sell", // "time": "1669191277315", // "isBlockTrade": false // } // // private trades classic spot https://bybit-exchange.github.io/docs/v5/position/execution // // { // "symbol": "QNTUSDT", // "orderId": "1538686353240339712", // "orderLinkId": "", // "side": "Sell", // "orderPrice": "", // "orderQty": "", // "leavesQty": "", // "orderType": "Limit", // "stopOrderType": "", // "execFee": "0.040919", // "execId": "2210000000097330907", // "execPrice": "98.6", // "execQty": "0.415", // "execType": "", // "execValue": "", // "execTime": "1698161716634", // "isMaker": true, // "feeRate": "", // "tradeIv": "", // "markIv": "", // "markPrice": "", // "indexPrice": "", // "underlyingPrice": "", // "blockTradeId": "" // } // // private trades unified https://bybit-exchange.github.io/docs/v5/position/execution // // { // "symbol": "QNTUSDT", // "orderType": "Limit", // "underlyingPrice": "", // "orderLinkId": "1549452573428424449", // "orderId": "1549452573428424448", // "stopOrderType": "", // "execTime": "1699445151998", // "feeRate": "0.00025", // "tradeIv": "", // "blockTradeId": "", // "markPrice": "", // "execPrice": "102.8", // "markIv": "", // "orderQty": "3.652", // "orderPrice": "102.8", // "execValue": "1.028", // "closedSize": "", // "execType": "Trade", // "seq": "19157444346", // "side": "Buy", // "indexPrice": "", // "leavesQty": "3.642", // "isMaker": true, // "execFee": "0.0000025", // "execId": "2210000000101610464", // "execQty": "0.01", // "nextPageCursor": "267951%3A0%2C38567%3A0" // }, // // private USDC settled trades // // { // "symbol": "ETHPERP", // "orderLinkId": "", // "side": "Buy", // "orderId": "aad0ee44-ce12-4112-aeee-b7829f6c3a26", // "execFee": "0.0210", // "feeRate": "0.000600", // "blockTradeId": "", // "tradeTime": "1669196417930", // "execPrice": "1162.15", // "lastLiquidityInd": "TAKER", // "execValue": "34.8645", // "execType": "Trade", // "execQty": "0.030", // "tradeId": "0e94eaf5-b08e-5505-b43f-7f1f30b1ca80" // } // market := GetArg(optionalArgs, 0, nil) _ = market var id interface{} = this.SafeStringN(trade, []interface{}{"execId", "id", "tradeId"}) var marketId interface{} = this.SafeString(trade, "symbol") var marketType interface{} = Ternary(IsTrue((InOp(trade, "createType"))), "contract", "spot") if IsTrue(!IsEqual(market, nil)) { marketType = GetValue(market, "type") } var category interface{} = this.SafeString(trade, "category") if IsTrue(!IsEqual(category, nil)) { if IsTrue(IsEqual(category, "spot")) { marketType = "spot" } } market = this.SafeMarket(marketId, market, nil, marketType) var symbol interface{} = GetValue(market, "symbol") var amountString interface{} = this.SafeStringN(trade, []interface{}{"execQty", "orderQty", "size"}) var priceString interface{} = this.SafeStringN(trade, []interface{}{"execPrice", "orderPrice", "price"}) var costString interface{} = this.SafeString(trade, "execValue") var timestamp interface{} = this.SafeIntegerN(trade, []interface{}{"time", "execTime", "tradeTime"}) var side interface{} = this.SafeStringLower(trade, "side") if IsTrue(IsEqual(side, nil)) { var isBuyer interface{} = this.SafeInteger(trade, "isBuyer") if IsTrue(!IsEqual(isBuyer, nil)) { side = Ternary(IsTrue(isBuyer), "buy", "sell") } } var isMaker interface{} = this.SafeBool(trade, "isMaker") var takerOrMaker interface{} = nil if IsTrue(!IsEqual(isMaker, nil)) { takerOrMaker = Ternary(IsTrue(isMaker), "maker", "taker") } else { var lastLiquidityInd interface{} = this.SafeString(trade, "lastLiquidityInd") if IsTrue(IsEqual(lastLiquidityInd, "UNKNOWN")) { lastLiquidityInd = nil } if IsTrue(!IsEqual(lastLiquidityInd, nil)) { if IsTrue(IsTrue((IsEqual(lastLiquidityInd, "TAKER"))) || IsTrue((IsEqual(lastLiquidityInd, "MAKER")))) { takerOrMaker = ToLower(lastLiquidityInd) } else { takerOrMaker = Ternary(IsTrue((IsEqual(lastLiquidityInd, "AddedLiquidity"))), "maker", "taker") } } } var orderType interface{} = this.SafeStringLower(trade, "orderType") if IsTrue(IsEqual(orderType, "unknown")) { orderType = nil } var feeCostString interface{} = this.SafeString(trade, "execFee") var fee interface{} = nil if IsTrue(!IsEqual(feeCostString, nil)) { var feeRateString interface{} = this.SafeString(trade, "feeRate") var feeCurrencyCode interface{} = nil if IsTrue(GetValue(market, "spot")) { if IsTrue(Precise.StringGt(feeCostString, "0")) { if IsTrue(IsEqual(side, "buy")) { feeCurrencyCode = GetValue(market, "base") } else { feeCurrencyCode = GetValue(market, "quote") } } else { if IsTrue(IsEqual(side, "buy")) { feeCurrencyCode = GetValue(market, "quote") } else { feeCurrencyCode = GetValue(market, "base") } } } else { feeCurrencyCode = Ternary(IsTrue(GetValue(market, "inverse")), GetValue(market, "base"), GetValue(market, "settle")) } fee = map[string]interface{} { "cost": feeCostString, "currency": feeCurrencyCode, "rate": feeRateString, } } return this.SafeTrade(map[string]interface{} { "id": id, "info": trade, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "symbol": symbol, "order": this.SafeString(trade, "orderId"), "type": orderType, "side": side, "takerOrMaker": takerOrMaker, "price": priceString, "amount": amountString, "cost": costString, "fee": fee, }, market) } /** * @method * @name bybit#fetchTrades * @description get the list of most recent trades for a particular symbol * @see https://bybit-exchange.github.io/docs/v5/market/recent-trade * @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 {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades} */ func (this *bybit) 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 if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " fetchTrades() requires a symbol argument"))) } retRes31178 := (<-this.LoadMarkets()) PanicOnError(retRes31178) var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } if IsTrue(!IsEqual(limit, nil)) { // spot: [1,60], default: 60. // others: [1,1000], default: 500 AddElementToObject(request, "limit", limit) } var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchTrades", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) AddElementToObject(request, "category", typeVar) response:= (<-this.PublicGetV5MarketRecentTrade(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "category": "spot", // "list": [ // { // "execId": "2100000000007764263", // "symbol": "BTCUSDT", // "price": "16618.49", // "size": "0.00012", // "side": "Buy", // "time": "1672052955758", // "isBlockTrade": false // } // ] // }, // "retExtInfo": {}, // "time": 1672053054358 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var trades interface{} = this.SafeList(result, "list", []interface{}{}) ch <- this.ParseTrades(trades, market, since, limit) return nil }() return ch } /** * @method * @name bybit#fetchOrderBook * @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data * @see https://bybit-exchange.github.io/docs/v5/market/orderbook * @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 *bybit) 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 if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " fetchOrderBook() requires a symbol argument"))) } retRes31748 := (<-this.LoadMarkets()) PanicOnError(retRes31748) var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } var defaultLimit interface{} = 25 if IsTrue(GetValue(market, "spot")) { // limit: [1, 50]. Default: 1 defaultLimit = 50 AddElementToObject(request, "category", "spot") } else { if IsTrue(GetValue(market, "option")) { // limit: [1, 25]. Default: 1 AddElementToObject(request, "category", "option") } else if IsTrue(GetValue(market, "linear")) { // limit: [1, 500]. Default: 25 AddElementToObject(request, "category", "linear") } else if IsTrue(GetValue(market, "inverse")) { // limit: [1, 500]. Default: 25 AddElementToObject(request, "category", "inverse") } } AddElementToObject(request, "limit", Ternary(IsTrue((!IsEqual(limit, nil))), limit, defaultLimit)) response:= (<-this.PublicGetV5MarketOrderbook(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "s": "BTCUSDT", // "a": [ // [ // "16638.64", // "0.008479" // ] // ], // "b": [ // [ // "16638.27", // "0.305749" // ] // ], // "ts": 1672765737733, // "u": 5277055 // }, // "retExtInfo": {}, // "time": 1672765737734 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var timestamp interface{} = this.SafeInteger(result, "ts") ch <- this.ParseOrderBook(result, symbol, timestamp, "b", "a") return nil }() return ch } func (this *bybit) ParseBalance(response interface{}) interface{} { // // cross // { // "retCode": 0, // "retMsg": "success", // "result": { // "acctBalanceSum": "0.122995614474732872", // "debtBalanceSum": "0.011734191124529754", // "loanAccountList": [ // { // "free": "0.001143855", // "interest": "0", // "loan": "0", // "locked": "0", // "tokenId": "BTC", // "total": "0.001143855" // }, // { // "free": "200.00005568", // "interest": "0.0008391", // "loan": "200", // "locked": "0", // "tokenId": "USDT", // "total": "200.00005568" // }, // ], // "riskRate": "0.0954", // "status": 1 // }, // "retExtInfo": {}, // "time": 1669843584123 // } // // funding // { // "retCode": 0, // "retMsg": "success", // "result": { // "memberId": "533285", // "accountType": "FUND", // "balance": [ // { // "coin": "USDT", // "transferBalance": "1010", // "walletBalance": "1010", // "bonus": "" // }, // { // "coin": "USDC", // "transferBalance": "0", // "walletBalance": "0", // "bonus": "" // } // ] // }, // "retExtInfo": {}, // "time": 1675865290069 // } // // spot & swap // { // "retCode": 0, // "retMsg": "OK", // "result": { // "list": [ // { // "totalEquity": "18070.32797922", // "accountIMRate": "0.0101", // "totalMarginBalance": "18070.32797922", // "totalInitialMargin": "182.60183684", // "accountType": "UNIFIED", // "totalAvailableBalance": "17887.72614237", // "accountMMRate": "0", // "totalPerpUPL": "-0.11001349", // "totalWalletBalance": "18070.43799271", // "accountLTV": "0.017", // "totalMaintenanceMargin": "0.38106773", // "coin": [ // { // "availableToBorrow": "2.5", // "bonus": "0", // "accruedInterest": "0", // "availableToWithdraw": "0.805994", // "totalOrderIM": "0", // "equity": "0.805994", // "totalPositionMM": "0", // "usdValue": "12920.95352538", // "unrealisedPnl": "0", // "borrowAmount": "0", // "totalPositionIM": "0", // "walletBalance": "0.805994", // "cumRealisedPnl": "0", // "coin": "BTC" // } // ] // } // ] // }, // "retExtInfo": {}, // "time": 1672125441042 // } // var timestamp interface{} = this.SafeInteger(response, "time") var result interface{} = map[string]interface{} { "info": response, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), } var responseResult interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var currencyList interface{} = this.SafeListN(responseResult, []interface{}{"loanAccountList", "list", "balance"}) if IsTrue(IsEqual(currencyList, nil)) { // usdc wallet var code interface{} = "USDC" var account interface{} = this.Account() AddElementToObject(account, "free", this.SafeString(responseResult, "availableBalance")) AddElementToObject(account, "total", this.SafeString(responseResult, "walletBalance")) AddElementToObject(result, code, account) } else { for i := 0; IsLessThan(i, GetArrayLength(currencyList)); i++ { var entry interface{} = GetValue(currencyList, i) var accountType interface{} = this.SafeString(entry, "accountType") if IsTrue(IsTrue(IsTrue(IsEqual(accountType, "UNIFIED")) || IsTrue(IsEqual(accountType, "CONTRACT"))) || IsTrue(IsEqual(accountType, "SPOT"))) { var coins interface{} = this.SafeList(entry, "coin") for j := 0; IsLessThan(j, GetArrayLength(coins)); j++ { var account interface{} = this.Account() var coinEntry interface{} = GetValue(coins, j) var loan interface{} = this.SafeString(coinEntry, "borrowAmount") var interest interface{} = this.SafeString(coinEntry, "accruedInterest") if IsTrue(IsTrue((!IsEqual(loan, nil))) && IsTrue((!IsEqual(interest, nil)))) { AddElementToObject(account, "debt", Precise.StringAdd(loan, interest)) } AddElementToObject(account, "total", this.SafeString(coinEntry, "walletBalance")) var free interface{} = this.SafeString2(coinEntry, "availableToWithdraw", "free") if IsTrue(!IsEqual(free, nil)) { AddElementToObject(account, "free", free) } else { var locked interface{} = this.SafeString(coinEntry, "locked", "0") var totalPositionIm interface{} = this.SafeString(coinEntry, "totalPositionIM", "0") var totalOrderIm interface{} = this.SafeString(coinEntry, "totalOrderIM", "0") var totalUsed interface{} = Precise.StringAdd(locked, totalPositionIm) totalUsed = Precise.StringAdd(totalUsed, totalOrderIm) AddElementToObject(account, "used", totalUsed) } // account['used'] = this.safeString (coinEntry, 'locked'); var currencyId interface{} = this.SafeString(coinEntry, "coin") var code interface{} = this.SafeCurrencyCode(currencyId) AddElementToObject(result, code, account) } } else { var account interface{} = this.Account() var loan interface{} = this.SafeString(entry, "loan") var interest interface{} = this.SafeString(entry, "interest") if IsTrue(IsTrue((!IsEqual(loan, nil))) && IsTrue((!IsEqual(interest, nil)))) { AddElementToObject(account, "debt", Precise.StringAdd(loan, interest)) } AddElementToObject(account, "total", this.SafeString2(entry, "total", "walletBalance")) AddElementToObject(account, "free", this.SafeStringN(entry, []interface{}{"free", "availableBalanceWithoutConvert", "availableBalance", "transferBalance"})) AddElementToObject(account, "used", this.SafeString(entry, "locked")) var currencyId interface{} = this.SafeStringN(entry, []interface{}{"tokenId", "coin", "currencyCoin"}) var code interface{} = this.SafeCurrencyCode(currencyId) AddElementToObject(result, code, account) } } } return this.SafeBalance(result) } /** * @method * @name bybit#fetchBalance * @description query for balance and get the amount of funds available for trading or funds locked in orders * @see https://bybit-exchange.github.io/docs/v5/spot-margin-normal/account-info * @see https://bybit-exchange.github.io/docs/v5/asset/all-balance * @see https://bybit-exchange.github.io/docs/v5/account/wallet-balance * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.type] wallet type, ['spot', 'swap', 'funding'] * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure} */ func (this *bybit) 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 retRes34088 := (<-this.LoadMarkets()) PanicOnError(retRes34088) var request interface{} = map[string]interface{} {} enableUnifiedMarginenableUnifiedAccountVariable := (<-this.IsUnifiedEnabled()); enableUnifiedMargin := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,0); enableUnifiedAccount := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,1) var isUnifiedAccount interface{} = (IsTrue(enableUnifiedMargin) || IsTrue(enableUnifiedAccount)) var typeVar interface{} = nil // don't use getBybitType here typeVarparamsVariable := this.HandleMarketTypeAndParams("fetchBalance", nil, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) var subType interface{} = nil subTypeparamsVariable := this.HandleSubTypeAndParams("fetchBalance", nil, params); subType = GetValue(subTypeparamsVariable,0); params = GetValue(subTypeparamsVariable,1) if IsTrue(IsTrue((IsEqual(typeVar, "swap"))) || IsTrue((IsEqual(typeVar, "future")))) { typeVar = subType } var lowercaseRawType interface{} = Ternary(IsTrue((!IsEqual(typeVar, nil))), ToLower(typeVar), nil) var isSpot interface{} = (IsEqual(typeVar, "spot")) var isLinear interface{} = (IsEqual(typeVar, "linear")) var isInverse interface{} = (IsEqual(typeVar, "inverse")) var isFunding interface{} = IsTrue((IsEqual(lowercaseRawType, "fund"))) || IsTrue((IsEqual(lowercaseRawType, "funding"))) if IsTrue(isUnifiedAccount) { var unifiedMarginStatus interface{} = this.SafeInteger(this.Options, "unifiedMarginStatus", 6) if IsTrue(IsLessThan(unifiedMarginStatus, 5)) { // it's not uta.20 where inverse are unified if IsTrue(isInverse) { typeVar = "contract" } else { typeVar = "unified" } } else { typeVar = "unified" // uta.20 where inverse are unified } } else { if IsTrue(IsTrue(isLinear) || IsTrue(isInverse)) { typeVar = "contract" } } var accountTypes interface{} = this.SafeDict(this.Options, "accountsByType", map[string]interface{} {}) var unifiedType interface{} = this.SafeStringUpper(accountTypes, typeVar, typeVar) var marginMode interface{} = nil marginModeparamsVariable := this.HandleMarginModeAndParams("fetchBalance", params); marginMode = GetValue(marginModeparamsVariable,0); params = GetValue(marginModeparamsVariable,1) var response interface{} = nil if IsTrue(IsTrue(isSpot) && IsTrue((!IsEqual(marginMode, nil)))) { response = (<-this.PrivateGetV5SpotCrossMarginTradeAccount(this.Extend(request, params))) PanicOnError(response) } else if IsTrue(isFunding) { // use this endpoint only we have no other choice // because it requires transfer permission AddElementToObject(request, "accountType", "FUND") response = (<-this.PrivateGetV5AssetTransferQueryAccountCoinsBalance(this.Extend(request, params))) PanicOnError(response) } else { AddElementToObject(request, "accountType", unifiedType) response = (<-this.PrivateGetV5AccountWalletBalance(this.Extend(request, params))) PanicOnError(response) } // // cross // { // "retCode": 0, // "retMsg": "success", // "result": { // "acctBalanceSum": "0.122995614474732872", // "debtBalanceSum": "0.011734191124529754", // "loanAccountList": [ // { // "free": "0.001143855", // "interest": "0", // "loan": "0", // "locked": "0", // "tokenId": "BTC", // "total": "0.001143855" // }, // { // "free": "200.00005568", // "interest": "0.0008391", // "loan": "200", // "locked": "0", // "tokenId": "USDT", // "total": "200.00005568" // }, // ], // "riskRate": "0.0954", // "status": 1 // }, // "retExtInfo": {}, // "time": 1669843584123 // } // // funding // { // "retCode": 0, // "retMsg": "success", // "result": { // "memberId": "533285", // "accountType": "FUND", // "balance": [ // { // "coin": "USDT", // "transferBalance": "1010", // "walletBalance": "1010", // "bonus": "" // }, // { // "coin": "USDC", // "transferBalance": "0", // "walletBalance": "0", // "bonus": "" // } // ] // }, // "retExtInfo": {}, // "time": 1675865290069 // } // // spot & swap // { // "retCode": 0, // "retMsg": "OK", // "result": { // "list": [ // { // "totalEquity": "18070.32797922", // "accountIMRate": "0.0101", // "totalMarginBalance": "18070.32797922", // "totalInitialMargin": "182.60183684", // "accountType": "UNIFIED", // "totalAvailableBalance": "17887.72614237", // "accountMMRate": "0", // "totalPerpUPL": "-0.11001349", // "totalWalletBalance": "18070.43799271", // "accountLTV": "0.017", // "totalMaintenanceMargin": "0.38106773", // "coin": [ // { // "availableToBorrow": "2.5", // "bonus": "0", // "accruedInterest": "0", // "availableToWithdraw": "0.805994", // "totalOrderIM": "0", // "equity": "0.805994", // "totalPositionMM": "0", // "usdValue": "12920.95352538", // "unrealisedPnl": "0", // "borrowAmount": "0", // "totalPositionIM": "0", // "walletBalance": "0.805994", // "cumRealisedPnl": "0", // "coin": "BTC" // } // ] // } // ] // }, // "retExtInfo": {}, // "time": 1672125441042 // } // ch <- this.ParseBalance(response) return nil }() return ch } func (this *bybit) ParseOrderStatus(status interface{}) interface{} { var statuses interface{} = map[string]interface{} { "NEW": "open", "PARTIALLY_FILLED": "open", "FILLED": "closed", "CANCELED": "canceled", "PENDING_CANCEL": "open", "PENDING_NEW": "open", "REJECTED": "rejected", "PARTIALLY_FILLED_CANCELLED": "closed", "Created": "open", "New": "open", "Rejected": "rejected", "PartiallyFilled": "open", "PartiallyFilledCanceled": "closed", "Filled": "closed", "PendingCancel": "open", "Cancelled": "canceled", "Untriggered": "open", "Deactivated": "canceled", "Triggered": "open", "Active": "open", } return this.SafeString(statuses, status, status) } func (this *bybit) ParseTimeInForce(timeInForce interface{}) interface{} { var timeInForces interface{} = map[string]interface{} { "GoodTillCancel": "GTC", "ImmediateOrCancel": "IOC", "FillOrKill": "FOK", "PostOnly": "PO", } return this.SafeString(timeInForces, timeInForce, timeInForce) } func (this *bybit) ParseOrder(order interface{}, optionalArgs ...interface{}) interface{} { // // v1 for usdc normal account // { // "symbol": "BTCPERP", // "orderType": "Market", // "orderLinkId": "", // "orderId": "36190ad3-de08-4b83-9ad3-56942f684b79", // "cancelType": "UNKNOWN", // "stopOrderType": "UNKNOWN", // "orderStatus": "Filled", // "updateTimeStamp": "1692769133267", // "takeProfit": "0.0000", // "cumExecValue": "259.6830", // "createdAt": "1692769133261", // "blockTradeId": "", // "orderPnl": "", // "price": "24674.7", // "tpTriggerBy": "UNKNOWN", // "timeInForce": "ImmediateOrCancel", // "updatedAt": "1692769133267", // "basePrice": "0.0", // "realisedPnl": "0.0000", // "side": "Sell", // "triggerPrice": "0.0", // "cumExecFee": "0.1429", // "leavesQty": "0.000", // "cashFlow": "", // "slTriggerBy": "UNKNOWN", // "iv": "", // "closeOnTrigger": "UNKNOWN", // "cumExecQty": "0.010", // "reduceOnly": 0, // "qty": "0.010", // "stopLoss": "0.0000", // "triggerBy": "UNKNOWN", // "orderIM": "" // } // // v5 // { // "orderId": "14bad3a1-6454-43d8-bcf2-5345896cf74d", // "orderLinkId": "YLxaWKMiHU", // "blockTradeId": "", // "symbol": "BTCUSDT", // "price": "26864.40", // "qty": "0.003", // "side": "Buy", // "isLeverage": "", // "positionIdx": 1, // "orderStatus": "Cancelled", // "cancelType": "UNKNOWN", // "rejectReason": "EC_PostOnlyWillTakeLiquidity", // "avgPrice": "0", // "leavesQty": "0.000", // "leavesValue": "0", // "cumExecQty": "0.000", // "cumExecValue": "0", // "cumExecFee": "0", // "timeInForce": "PostOnly", // "orderType": "Limit", // "stopOrderType": "UNKNOWN", // "orderIv": "", // "triggerPrice": "0.00", // "takeProfit": "0.00", // "stopLoss": "0.00", // "tpTriggerBy": "UNKNOWN", // "slTriggerBy": "UNKNOWN", // "triggerDirection": 0, // "triggerBy": "UNKNOWN", // "lastPriceOnCreated": "0.00", // "reduceOnly": false, // "closeOnTrigger": false, // "smpType": "None", // "smpGroup": 0, // "smpOrderId": "", // "tpslMode": "", // "tpLimitPrice": "", // "slLimitPrice": "", // "placeType": "", // "createdTime": "1684476068369", // "updatedTime": "1684476068372" // } // createOrders failed order // { // "category": "linear", // "symbol": "LTCUSDT", // "orderId": '', // "orderLinkId": '', // "createAt": '', // "code": "10001", // "msg": "The number of contracts exceeds maximum limit allowed: too large" // } // market := GetArg(optionalArgs, 0, nil) _ = market var code interface{} = this.SafeString(order, "code") if IsTrue(!IsEqual(code, nil)) { if IsTrue(!IsEqual(code, "0")) { var category interface{} = this.SafeString(order, "category") var inferredMarketType interface{} = Ternary(IsTrue((IsEqual(category, "spot"))), "spot", "contract") return this.SafeOrder(map[string]interface{} { "info": order, "status": "rejected", "id": this.SafeString(order, "orderId"), "clientOrderId": this.SafeString(order, "orderLinkId"), "symbol": this.SafeSymbol(this.SafeString(order, "symbol"), nil, nil, inferredMarketType), }) } } var marketId interface{} = this.SafeString(order, "symbol") var isContract interface{} = (InOp(order, "tpslMode")) var marketType interface{} = nil if IsTrue(!IsEqual(market, nil)) { marketType = GetValue(market, "type") } else { marketType = Ternary(IsTrue(isContract), "contract", "spot") } market = this.SafeMarket(marketId, market, nil, marketType) var symbol interface{} = GetValue(market, "symbol") var timestamp interface{} = this.SafeInteger2(order, "createdTime", "createdAt") var marketUnit interface{} = this.SafeString(order, "marketUnit", "baseCoin") var id interface{} = this.SafeString(order, "orderId") var typeVar interface{} = this.SafeStringLower(order, "orderType") var price interface{} = this.SafeString(order, "price") var amount interface{} = nil var cost interface{} = nil if IsTrue(IsEqual(marketUnit, "baseCoin")) { amount = this.SafeString(order, "qty") cost = this.SafeString(order, "cumExecValue") } else { cost = this.SafeString(order, "cumExecValue") } var filled interface{} = this.SafeString(order, "cumExecQty") var remaining interface{} = this.SafeString(order, "leavesQty") var lastTradeTimestamp interface{} = this.SafeInteger2(order, "updatedTime", "updatedAt") var rawStatus interface{} = this.SafeString(order, "orderStatus") var status interface{} = this.ParseOrderStatus(rawStatus) var side interface{} = this.SafeStringLower(order, "side") var fee interface{} = nil var feeCostString interface{} = this.SafeString(order, "cumExecFee") if IsTrue(!IsEqual(feeCostString, nil)) { var feeCurrencyCode interface{} = nil if IsTrue(GetValue(market, "spot")) { if IsTrue(Precise.StringGt(feeCostString, "0")) { if IsTrue(IsEqual(side, "buy")) { feeCurrencyCode = GetValue(market, "base") } else { feeCurrencyCode = GetValue(market, "quote") } } else { if IsTrue(IsEqual(side, "buy")) { feeCurrencyCode = GetValue(market, "quote") } else { feeCurrencyCode = GetValue(market, "base") } } } else { feeCurrencyCode = Ternary(IsTrue(GetValue(market, "inverse")), GetValue(market, "base"), GetValue(market, "settle")) } fee = map[string]interface{} { "cost": this.ParseNumber(feeCostString), "currency": feeCurrencyCode, } } var clientOrderId interface{} = this.SafeString(order, "orderLinkId") if IsTrue(IsTrue((!IsEqual(clientOrderId, nil))) && IsTrue((IsLessThan(GetLength(clientOrderId), 1)))) { clientOrderId = nil } var avgPrice interface{} = this.OmitZero(this.SafeString(order, "avgPrice")) var rawTimeInForce interface{} = this.SafeString(order, "timeInForce") var timeInForce interface{} = this.ParseTimeInForce(rawTimeInForce) var triggerPrice interface{} = this.OmitZero(this.SafeString(order, "triggerPrice")) var reduceOnly interface{} = this.SafeBool(order, "reduceOnly") var takeProfitPrice interface{} = this.OmitZero(this.SafeString(order, "takeProfit")) var stopLossPrice interface{} = this.OmitZero(this.SafeString(order, "stopLoss")) var triggerDirection interface{} = this.SafeString(order, "triggerDirection") var isAscending interface{} = (IsEqual(triggerDirection, "1")) var isStopOrderType2 interface{} = IsTrue((!IsEqual(triggerPrice, nil))) && IsTrue(reduceOnly) if IsTrue(IsTrue((IsEqual(stopLossPrice, nil))) && IsTrue(isStopOrderType2)) { // check if order is stop order type 2 - stopLossPrice if IsTrue(IsTrue(isAscending) && IsTrue((IsEqual(side, "buy")))) { // stopLoss order against short position stopLossPrice = triggerPrice } if IsTrue(!IsTrue(isAscending) && IsTrue((IsEqual(side, "sell")))) { // stopLoss order against a long position stopLossPrice = triggerPrice } } if IsTrue(IsTrue((IsEqual(takeProfitPrice, nil))) && IsTrue(isStopOrderType2)) { // check if order is stop order type 2 - takeProfitPrice if IsTrue(IsTrue(isAscending) && IsTrue((IsEqual(side, "sell")))) { // takeprofit order against a long position takeProfitPrice = triggerPrice } if IsTrue(!IsTrue(isAscending) && IsTrue((IsEqual(side, "buy")))) { // takeprofit order against a short position takeProfitPrice = triggerPrice } } return this.SafeOrder(map[string]interface{} { "info": order, "id": id, "clientOrderId": clientOrderId, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "lastTradeTimestamp": lastTradeTimestamp, "lastUpdateTimestamp": lastTradeTimestamp, "symbol": symbol, "type": typeVar, "timeInForce": timeInForce, "postOnly": nil, "reduceOnly": this.SafeBool(order, "reduceOnly"), "side": side, "price": price, "triggerPrice": triggerPrice, "takeProfitPrice": takeProfitPrice, "stopLossPrice": stopLossPrice, "amount": amount, "cost": cost, "average": avgPrice, "filled": filled, "remaining": remaining, "status": status, "fee": fee, "trades": nil, }, market) } /** * @method * @name bybit#createMarketBuyOrderWithCost * @description create a market buy order by providing the symbol and cost * @see https://bybit-exchange.github.io/docs/v5/order/create-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 *bybit) 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 retRes38418 := (<-this.LoadMarkets()) PanicOnError(retRes38418) var market interface{} = this.Market(symbol) if !IsTrue(GetValue(market, "spot")) { panic(NotSupported(Add(this.Id, " createMarketBuyOrderWithCost() supports spot orders only"))) } retRes384615 := (<-this.CreateOrder(symbol, "market", "buy", cost, 1, params)) PanicOnError(retRes384615) ch <- retRes384615 return nil }() return ch } /** * @method * @name bybit#createMarkeSellOrderWithCost * @description create a market sell order by providing the symbol and cost * @see https://bybit-exchange.github.io/docs/v5/order/create-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 *bybit) 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 retRes38608 := (<-this.LoadMarkets()) PanicOnError(retRes38608) types:= (<-this.IsUnifiedEnabled()) PanicOnError(types) var enableUnifiedAccount interface{} = GetValue(types, 1) if !IsTrue(enableUnifiedAccount) { panic(NotSupported(Add(this.Id, " createMarketSellOrderWithCost() supports UTA accounts only"))) } var market interface{} = this.Market(symbol) if !IsTrue(GetValue(market, "spot")) { panic(NotSupported(Add(this.Id, " createMarketSellOrderWithCost() supports spot orders only"))) } retRes387015 := (<-this.CreateOrder(symbol, "market", "sell", cost, 1, params)) PanicOnError(retRes387015) ch <- retRes387015 return nil }() return ch } /** * @method * @name bybit#createOrder * @description create a trade order * @see https://bybit-exchange.github.io/docs/v5/order/create-order * @see https://bybit-exchange.github.io/docs/v5/position/trading-stop * @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.timeInForce] "GTC", "IOC", "FOK" * @param {bool} [params.postOnly] true or false whether the order is post-only * @param {bool} [params.reduceOnly] true or false whether the order is reduce-only * @param {string} [params.positionIdx] *contracts only* 0 for one-way mode, 1 buy side of hedged mode, 2 sell side of hedged mode * @param {bool} [params.hedged] *contracts only* true for hedged mode, false for one way mode, default is false * @param {int} [params.isLeverage] *unified spot only* false then spot trading true then margin trading * @param {string} [params.tpslMode] *contract only* 'full' or 'partial' * @param {string} [params.mmp] *option only* market maker protection * @param {string} [params.triggerDirection] *contract only* the direction for trigger orders, 'above' or 'below' * @param {float} [params.triggerPrice] The price at which a trigger order is triggered at * @param {float} [params.stopLossPrice] The price at which a stop loss order is triggered at * @param {float} [params.takeProfitPrice] The price at which a take profit order is triggered at * @param {object} [params.takeProfit] *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered * @param {float} [params.takeProfit.triggerPrice] take profit trigger price * @param {object} [params.stopLoss] *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered * @param {float} [params.stopLoss.triggerPrice] stop loss trigger price * @param {string} [params.trailingAmount] the quote amount to trail away from the current market price * @param {string} [params.trailingTriggerPrice] the price to trigger a trailing order, default uses the price argument * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) 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 retRes39068 := (<-this.LoadMarkets()) PanicOnError(retRes39068) var market interface{} = this.Market(symbol) parts:= (<-this.IsUnifiedEnabled()) PanicOnError(parts) var enableUnifiedAccount interface{} = GetValue(parts, 1) var trailingAmount interface{} = this.SafeString2(params, "trailingAmount", "trailingStop") var isTrailingAmountOrder interface{} = !IsEqual(trailingAmount, nil) var orderRequest interface{} = this.CreateOrderRequest(symbol, typeVar, side, amount, price, params, enableUnifiedAccount) var options interface{} = this.SafeDict(this.Options, "createOrder", map[string]interface{} {}) var defaultMethod interface{} = this.SafeString(options, "method", "privatePostV5OrderCreate") var response interface{} = nil if IsTrue(IsTrue(isTrailingAmountOrder) || IsTrue((IsEqual(defaultMethod, "privatePostV5PositionTradingStop")))) { response = (<-this.PrivatePostV5PositionTradingStop(orderRequest)) PanicOnError(response) } else { response = (<-this.PrivatePostV5OrderCreate(orderRequest)) PanicOnError(response) // already extended inside createOrderRequest } // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "orderId": "1321003749386327552", // "orderLinkId": "spot-test-postonly" // }, // "retExtInfo": {}, // "time": 1672211918471 // } // var order interface{} = this.SafeDict(response, "result", map[string]interface{} {}) ch <- this.ParseOrder(order, market) return nil }() return ch } func (this *bybit) CreateOrderRequest(symbol interface{}, typeVar interface{}, side interface{}, amount interface{}, optionalArgs ...interface{}) interface{} { price := GetArg(optionalArgs, 0, nil) _ = price params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params isUTA := GetArg(optionalArgs, 2, true) _ = isUTA var market interface{} = this.Market(symbol) symbol = GetValue(market, "symbol") var lowerCaseType interface{} = ToLower(typeVar) if IsTrue(IsTrue((IsEqual(price, nil))) && IsTrue((IsEqual(lowerCaseType, "limit")))) { panic(ArgumentsRequired(Add(this.Id, " createOrder requires a price argument for limit orders"))) } var defaultMethod interface{} = nil defaultMethodparamsVariable := this.HandleOptionAndParams(params, "createOrder", "method", "privatePostV5OrderCreate"); defaultMethod = GetValue(defaultMethodparamsVariable,0); params = GetValue(defaultMethodparamsVariable,1) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } var hedged interface{} = this.SafeBool(params, "hedged", false) var reduceOnly interface{} = this.SafeBool(params, "reduceOnly") var triggerPrice interface{} = this.SafeValue2(params, "triggerPrice", "stopPrice") var stopLossTriggerPrice interface{} = this.SafeValue(params, "stopLossPrice") var takeProfitTriggerPrice interface{} = this.SafeValue(params, "takeProfitPrice") var stopLoss interface{} = this.SafeValue(params, "stopLoss") var takeProfit interface{} = this.SafeValue(params, "takeProfit") var trailingTriggerPrice interface{} = this.SafeString2(params, "trailingTriggerPrice", "activePrice", this.NumberToString(price)) var trailingAmount interface{} = this.SafeString2(params, "trailingAmount", "trailingStop") var isTrailingAmountOrder interface{} = !IsEqual(trailingAmount, nil) var isTriggerOrder interface{} = !IsEqual(triggerPrice, nil) var isStopLossTriggerOrder interface{} = !IsEqual(stopLossTriggerPrice, nil) var isTakeProfitTriggerOrder interface{} = !IsEqual(takeProfitTriggerPrice, nil) var isStopLoss interface{} = !IsEqual(stopLoss, nil) var isTakeProfit interface{} = !IsEqual(takeProfit, nil) var isMarket interface{} = IsEqual(lowerCaseType, "market") var isLimit interface{} = IsEqual(lowerCaseType, "limit") var isBuy interface{} = IsEqual(side, "buy") var isAlternativeEndpoint interface{} = IsEqual(defaultMethod, "privatePostV5PositionTradingStop") var amountString interface{} = this.GetAmount(symbol, amount) var priceString interface{} = Ternary(IsTrue((!IsEqual(price, nil))), this.GetPrice(symbol, this.NumberToString(price)), nil) if IsTrue(IsTrue(isTrailingAmountOrder) || IsTrue(isAlternativeEndpoint)) { if IsTrue(IsTrue(IsTrue(IsTrue(isStopLoss) || IsTrue(isTakeProfit)) || IsTrue(isTriggerOrder)) || IsTrue(GetValue(market, "spot"))) { panic(InvalidOrder(Add(this.Id, " the API endpoint used only supports contract trailingAmount, stopLossPrice and takeProfitPrice orders"))) } if IsTrue(IsTrue(isStopLossTriggerOrder) || IsTrue(isTakeProfitTriggerOrder)) { if IsTrue(isStopLossTriggerOrder) { AddElementToObject(request, "stopLoss", this.GetPrice(symbol, stopLossTriggerPrice)) if IsTrue(isLimit) { AddElementToObject(request, "tpslMode", "Partial") AddElementToObject(request, "slOrderType", "Limit") AddElementToObject(request, "slLimitPrice", priceString) AddElementToObject(request, "slSize", amountString) } } else if IsTrue(isTakeProfitTriggerOrder) { AddElementToObject(request, "takeProfit", this.GetPrice(symbol, takeProfitTriggerPrice)) if IsTrue(isLimit) { AddElementToObject(request, "tpslMode", "Partial") AddElementToObject(request, "tpOrderType", "Limit") AddElementToObject(request, "tpLimitPrice", priceString) AddElementToObject(request, "tpSize", amountString) } } } } else { AddElementToObject(request, "side", this.Capitalize(side)) AddElementToObject(request, "orderType", this.Capitalize(lowerCaseType)) var timeInForce interface{} = this.SafeStringLower(params, "timeInForce") // this is same as exchange specific param var postOnly interface{} = nil postOnlyparamsVariable := this.HandlePostOnly(isMarket, IsEqual(timeInForce, "postonly"), params); postOnly = GetValue(postOnlyparamsVariable,0); params = GetValue(postOnlyparamsVariable,1) if IsTrue(postOnly) { AddElementToObject(request, "timeInForce", "PostOnly") } else if IsTrue(IsEqual(timeInForce, "gtc")) { AddElementToObject(request, "timeInForce", "GTC") } else if IsTrue(IsEqual(timeInForce, "fok")) { AddElementToObject(request, "timeInForce", "FOK") } else if IsTrue(IsEqual(timeInForce, "ioc")) { AddElementToObject(request, "timeInForce", "IOC") } if IsTrue(GetValue(market, "spot")) { // only works for spot market if IsTrue(!IsEqual(triggerPrice, nil)) { AddElementToObject(request, "orderFilter", "StopOrder") } else if IsTrue(IsTrue(IsTrue(IsTrue(!IsEqual(stopLossTriggerPrice, nil)) || IsTrue(!IsEqual(takeProfitTriggerPrice, nil))) || IsTrue(isStopLoss)) || IsTrue(isTakeProfit)) { AddElementToObject(request, "orderFilter", "tpslOrder") } } var clientOrderId interface{} = this.SafeString(params, "clientOrderId") if IsTrue(!IsEqual(clientOrderId, nil)) { AddElementToObject(request, "orderLinkId", clientOrderId) } else if IsTrue(GetValue(market, "option")) { // mandatory field for options AddElementToObject(request, "orderLinkId", this.Uuid16()) } if IsTrue(isLimit) { AddElementToObject(request, "price", priceString) } } if IsTrue(GetValue(market, "spot")) { AddElementToObject(request, "category", "spot") } else if IsTrue(GetValue(market, "linear")) { AddElementToObject(request, "category", "linear") } else if IsTrue(GetValue(market, "inverse")) { AddElementToObject(request, "category", "inverse") } else if IsTrue(GetValue(market, "option")) { AddElementToObject(request, "category", "option") } var cost interface{} = this.SafeString(params, "cost") params = this.Omit(params, "cost") // if the cost is inferable, let's keep the old logic and ignore marketUnit, to minimize the impact of the changes var isMarketBuyAndCostInferable interface{} = IsTrue(IsTrue((IsEqual(lowerCaseType, "market"))) && IsTrue((IsEqual(side, "buy")))) && IsTrue((IsTrue((!IsEqual(price, nil))) || IsTrue((!IsEqual(cost, nil))))) if IsTrue(IsTrue(IsTrue(IsTrue(GetValue(market, "spot")) && IsTrue((IsEqual(typeVar, "market")))) && IsTrue(isUTA)) && !IsTrue(isMarketBuyAndCostInferable)) { // UTA account can specify the cost of the order on both sides if IsTrue(IsTrue((!IsEqual(cost, nil))) || IsTrue((!IsEqual(price, nil)))) { AddElementToObject(request, "marketUnit", "quoteCoin") var orderCost interface{} = nil if IsTrue(!IsEqual(cost, nil)) { orderCost = cost } else { var quoteAmount interface{} = Precise.StringMul(amountString, priceString) orderCost = quoteAmount } AddElementToObject(request, "qty", this.GetCost(symbol, orderCost)) } else { AddElementToObject(request, "marketUnit", "baseCoin") AddElementToObject(request, "qty", amountString) } } else if IsTrue(IsTrue(IsTrue(GetValue(market, "spot")) && IsTrue((IsEqual(typeVar, "market")))) && IsTrue((IsEqual(side, "buy")))) { // classic accounts // for market buy it requires the amount of quote currency to spend var createMarketBuyOrderRequiresPrice interface{} = true createMarketBuyOrderRequiresPriceparamsVariable := this.HandleOptionAndParams(params, "createOrder", "createMarketBuyOrderRequiresPrice"); createMarketBuyOrderRequiresPrice = GetValue(createMarketBuyOrderRequiresPriceparamsVariable,0); params = GetValue(createMarketBuyOrderRequiresPriceparamsVariable,1) if IsTrue(createMarketBuyOrderRequiresPrice) { if IsTrue(IsTrue((IsEqual(price, nil))) && IsTrue((IsEqual(cost, nil)))) { panic(InvalidOrder(Add(this.Id, " createOrder() requires the price argument for market buy orders to calculate the total cost to spend (amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to false and pass the cost to spend in the amount argument"))) } else { var quoteAmount interface{} = Precise.StringMul(amountString, priceString) var costRequest interface{} = Ternary(IsTrue((!IsEqual(cost, nil))), cost, quoteAmount) AddElementToObject(request, "qty", this.GetCost(symbol, costRequest)) } } else { if IsTrue(!IsEqual(cost, nil)) { AddElementToObject(request, "qty", this.GetCost(symbol, this.NumberToString(cost))) } else if IsTrue(!IsEqual(price, nil)) { AddElementToObject(request, "qty", this.GetCost(symbol, Precise.StringMul(amountString, priceString))) } else { AddElementToObject(request, "qty", amountString) } } } else { if IsTrue(!IsTrue(isTrailingAmountOrder) && !IsTrue(isAlternativeEndpoint)) { AddElementToObject(request, "qty", amountString) } } if IsTrue(isTrailingAmountOrder) { if IsTrue(!IsEqual(trailingTriggerPrice, nil)) { AddElementToObject(request, "activePrice", this.GetPrice(symbol, trailingTriggerPrice)) } AddElementToObject(request, "trailingStop", trailingAmount) } else if IsTrue(IsTrue(isTriggerOrder) && !IsTrue(isAlternativeEndpoint)) { var triggerDirection interface{} = this.SafeString(params, "triggerDirection") params = this.Omit(params, []interface{}{"triggerPrice", "stopPrice", "triggerDirection"}) if IsTrue(GetValue(market, "spot")) { if IsTrue(!IsEqual(triggerDirection, nil)) { panic(NotSupported(Add(this.Id, " createOrder() : trigger order does not support triggerDirection for spot markets yet"))) } } else { if IsTrue(IsEqual(triggerDirection, nil)) { panic(ArgumentsRequired(Add(this.Id, " stop/trigger orders require a triggerDirection parameter, either \"above\" or \"below\" to determine the direction of the trigger."))) } var isAsending interface{} = (IsTrue((IsEqual(triggerDirection, "above"))) || IsTrue((IsEqual(triggerDirection, "1")))) AddElementToObject(request, "triggerDirection", Ternary(IsTrue(isAsending), 1, 2)) } AddElementToObject(request, "triggerPrice", this.GetPrice(symbol, triggerPrice)) } else if IsTrue(IsTrue((IsTrue(isStopLossTriggerOrder) || IsTrue(isTakeProfitTriggerOrder))) && !IsTrue(isAlternativeEndpoint)) { if IsTrue(isBuy) { AddElementToObject(request, "triggerDirection", Ternary(IsTrue(isStopLossTriggerOrder), 1, 2)) } else { AddElementToObject(request, "triggerDirection", Ternary(IsTrue(isStopLossTriggerOrder), 2, 1)) } triggerPrice = Ternary(IsTrue(isStopLossTriggerOrder), stopLossTriggerPrice, takeProfitTriggerPrice) AddElementToObject(request, "triggerPrice", this.GetPrice(symbol, triggerPrice)) AddElementToObject(request, "reduceOnly", true) } if IsTrue(IsTrue((IsTrue(isStopLoss) || IsTrue(isTakeProfit))) && !IsTrue(isAlternativeEndpoint)) { if IsTrue(isStopLoss) { var slTriggerPrice interface{} = this.SafeValue2(stopLoss, "triggerPrice", "stopPrice", stopLoss) AddElementToObject(request, "stopLoss", this.GetPrice(symbol, slTriggerPrice)) var slLimitPrice interface{} = this.SafeValue(stopLoss, "price") if IsTrue(!IsEqual(slLimitPrice, nil)) { AddElementToObject(request, "tpslMode", "Partial") AddElementToObject(request, "slOrderType", "Limit") AddElementToObject(request, "slLimitPrice", this.GetPrice(symbol, slLimitPrice)) } } if IsTrue(isTakeProfit) { var tpTriggerPrice interface{} = this.SafeValue2(takeProfit, "triggerPrice", "stopPrice", takeProfit) AddElementToObject(request, "takeProfit", this.GetPrice(symbol, tpTriggerPrice)) var tpLimitPrice interface{} = this.SafeValue(takeProfit, "price") if IsTrue(!IsEqual(tpLimitPrice, nil)) { AddElementToObject(request, "tpslMode", "Partial") AddElementToObject(request, "tpOrderType", "Limit") AddElementToObject(request, "tpLimitPrice", this.GetPrice(symbol, tpLimitPrice)) } } } if IsTrue(!IsTrue(GetValue(market, "spot")) && IsTrue(hedged)) { if IsTrue(reduceOnly) { params = this.Omit(params, "reduceOnly") side = Ternary(IsTrue((IsEqual(side, "buy"))), "sell", "buy") } AddElementToObject(request, "positionIdx", Ternary(IsTrue((IsEqual(side, "buy"))), 1, 2)) } params = this.Omit(params, []interface{}{"stopPrice", "timeInForce", "stopLossPrice", "takeProfitPrice", "postOnly", "clientOrderId", "triggerPrice", "stopLoss", "takeProfit", "trailingAmount", "trailingTriggerPrice", "hedged"}) return this.Extend(request, params) } /** * @method * @name bybit#createOrders * @description create a list of trade orders * @see https://bybit-exchange.github.io/docs/v5/order/batch-place * @param {Array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) 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 retRes41788 := (<-this.LoadMarkets()) PanicOnError(retRes41788) accounts:= (<-this.IsUnifiedEnabled()) PanicOnError(accounts) var isUta interface{} = GetValue(accounts, 1) var ordersRequests interface{} = []interface{}{} var orderSymbols interface{} = []interface{}{} for i := 0; IsLessThan(i, GetArrayLength(orders)); i++ { var rawOrder interface{} = GetValue(orders, i) var marketId interface{} = this.SafeString(rawOrder, "symbol") AppendToArray(&orderSymbols,marketId) var typeVar interface{} = this.SafeString(rawOrder, "type") var side interface{} = this.SafeString(rawOrder, "side") var amount interface{} = this.SafeValue(rawOrder, "amount") var price interface{} = this.SafeValue(rawOrder, "price") var orderParams interface{} = this.SafeDict(rawOrder, "params", map[string]interface{} {}) var orderRequest interface{} = this.CreateOrderRequest(marketId, typeVar, side, amount, price, orderParams, isUta) Remove(orderRequest, "category") AppendToArray(&ordersRequests,orderRequest) } var symbols interface{} = this.MarketSymbols(orderSymbols, nil, false, true, true) var market interface{} = this.Market(GetValue(symbols, 0)) var unifiedMarginStatus interface{} = this.SafeInteger(this.Options, "unifiedMarginStatus", 6) var category interface{} = nil categoryparamsVariable := this.GetBybitType("createOrders", market, params); category = GetValue(categoryparamsVariable,0); params = GetValue(categoryparamsVariable,1) if IsTrue(IsTrue((IsEqual(category, "inverse"))) && IsTrue((IsLessThan(unifiedMarginStatus, 5)))) { panic(NotSupported(Add(this.Id, " createOrders does not allow inverse orders for non UTA2.0 account"))) } var request interface{} = map[string]interface{} { "category": category, "request": ordersRequests, } response:= (<-this.PrivatePostV5OrderCreateBatch(this.Extend(request, params))) PanicOnError(response) var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var data interface{} = this.SafeList(result, "list", []interface{}{}) var retInfo interface{} = this.SafeDict(response, "retExtInfo", map[string]interface{} {}) var codes interface{} = this.SafeList(retInfo, "list", []interface{}{}) // extend the error with the unsuccessful orders for i := 0; IsLessThan(i, GetArrayLength(codes)); i++ { var code interface{} = GetValue(codes, i) var retCode interface{} = this.SafeInteger(code, "code") if IsTrue(!IsEqual(retCode, 0)) { AddElementToObject(data, i, this.Extend(GetValue(data, i), code)) } } // // { // "retCode":0, // "retMsg":"OK", // "result":{ // "list":[ // { // "category":"linear", // "symbol":"LTCUSDT", // "orderId":"", // "orderLinkId":"", // "createAt":"" // }, // { // "category":"linear", // "symbol":"LTCUSDT", // "orderId":"3c9f65b6-01ad-4ac0-9741-df17e02a4223", // "orderLinkId":"", // "createAt":"1698075516029" // } // ] // }, // "retExtInfo":{ // "list":[ // { // "code":10001, // "msg":"The number of contracts exceeds maximum limit allowed: too large" // }, // { // "code":0, // "msg":"OK" // } // ] // }, // "time":1698075516029 // } // ch <- this.ParseOrders(data) return nil }() return ch } func (this *bybit) EditOrderRequest(id interface{}, symbol interface{}, typeVar interface{}, side interface{}, optionalArgs ...interface{}) interface{} { amount := GetArg(optionalArgs, 0, nil) _ = amount price := GetArg(optionalArgs, 1, nil) _ = price params := GetArg(optionalArgs, 2, map[string]interface{} {}) _ = params var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), "orderId": id, } if IsTrue(GetValue(market, "spot")) { AddElementToObject(request, "category", "spot") } else if IsTrue(GetValue(market, "linear")) { AddElementToObject(request, "category", "linear") } else if IsTrue(GetValue(market, "inverse")) { AddElementToObject(request, "category", "inverse") } else if IsTrue(GetValue(market, "option")) { AddElementToObject(request, "category", "option") } if IsTrue(!IsEqual(amount, nil)) { AddElementToObject(request, "qty", this.GetAmount(symbol, amount)) } if IsTrue(!IsEqual(price, nil)) { AddElementToObject(request, "price", this.GetPrice(symbol, this.NumberToString(price))) } var triggerPrice interface{} = this.SafeString2(params, "triggerPrice", "stopPrice") var stopLossTriggerPrice interface{} = this.SafeString(params, "stopLossPrice") var takeProfitTriggerPrice interface{} = this.SafeString(params, "takeProfitPrice") var stopLoss interface{} = this.SafeValue(params, "stopLoss") var takeProfit interface{} = this.SafeValue(params, "takeProfit") var isStopLossTriggerOrder interface{} = !IsEqual(stopLossTriggerPrice, nil) var isTakeProfitTriggerOrder interface{} = !IsEqual(takeProfitTriggerPrice, nil) var isStopLoss interface{} = !IsEqual(stopLoss, nil) var isTakeProfit interface{} = !IsEqual(takeProfit, nil) if IsTrue(IsTrue(isStopLossTriggerOrder) || IsTrue(isTakeProfitTriggerOrder)) { triggerPrice = Ternary(IsTrue(isStopLossTriggerOrder), stopLossTriggerPrice, takeProfitTriggerPrice) } if IsTrue(!IsEqual(triggerPrice, nil)) { var triggerPriceRequest interface{} = Ternary(IsTrue((IsEqual(triggerPrice, "0"))), triggerPrice, this.GetPrice(symbol, triggerPrice)) AddElementToObject(request, "triggerPrice", triggerPriceRequest) var triggerBy interface{} = this.SafeString(params, "triggerBy", "LastPrice") AddElementToObject(request, "triggerBy", triggerBy) } if IsTrue(IsTrue(isStopLoss) || IsTrue(isTakeProfit)) { if IsTrue(isStopLoss) { var slTriggerPrice interface{} = this.SafeString2(stopLoss, "triggerPrice", "stopPrice", stopLoss) var stopLossRequest interface{} = Ternary(IsTrue((IsEqual(slTriggerPrice, "0"))), slTriggerPrice, this.GetPrice(symbol, slTriggerPrice)) AddElementToObject(request, "stopLoss", stopLossRequest) var slTriggerBy interface{} = this.SafeString(params, "slTriggerBy", "LastPrice") AddElementToObject(request, "slTriggerBy", slTriggerBy) } if IsTrue(isTakeProfit) { var tpTriggerPrice interface{} = this.SafeString2(takeProfit, "triggerPrice", "stopPrice", takeProfit) var takeProfitRequest interface{} = Ternary(IsTrue((IsEqual(tpTriggerPrice, "0"))), tpTriggerPrice, this.GetPrice(symbol, tpTriggerPrice)) AddElementToObject(request, "takeProfit", takeProfitRequest) var tpTriggerBy interface{} = this.SafeString(params, "tpTriggerBy", "LastPrice") AddElementToObject(request, "tpTriggerBy", tpTriggerBy) } } var clientOrderId interface{} = this.SafeString(params, "clientOrderId") if IsTrue(!IsEqual(clientOrderId, nil)) { AddElementToObject(request, "orderLinkId", clientOrderId) } params = this.Omit(params, []interface{}{"stopPrice", "stopLossPrice", "takeProfitPrice", "triggerPrice", "clientOrderId", "stopLoss", "takeProfit"}) return request } /** * @method * @name bybit#editOrder * @description edit a trade order * @see https://bybit-exchange.github.io/docs/v5/order/amend-order * @see https://bybit-exchange.github.io/docs/derivatives/unified/replace-order * @see https://bybit-exchange.github.io/docs/api-explorer/derivatives/trade/contract/replace-order * @param {string} id cancel order id * @param {string} symbol unified symbol of the market to create an order in * @param {string} type 'market' or 'limit' * @param {string} side 'buy' or 'sell' * @param {float} amount how much 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 {float} [params.triggerPrice] The price that a trigger order is triggered at * @param {float} [params.stopLossPrice] The price that a stop loss order is triggered at * @param {float} [params.takeProfitPrice] The price that a take profit order is triggered at * @param {object} [params.takeProfit] *takeProfit object in params* containing the triggerPrice that the attached take profit order will be triggered * @param {float} [params.takeProfit.triggerPrice] take profit trigger price * @param {object} [params.stopLoss] *stopLoss object in params* containing the triggerPrice that the attached stop loss order will be triggered * @param {float} [params.stopLoss.triggerPrice] stop loss trigger price * @param {string} [params.triggerBy] 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for triggerPrice * @param {string} [params.slTriggerBy] 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for stopLoss * @param {string} [params.tpTriggerby] 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for takeProfit * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) EditOrder(id interface{}, symbol interface{}, typeVar interface{}, side interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) amount := GetArg(optionalArgs, 0, nil) _ = amount price := GetArg(optionalArgs, 1, nil) _ = price params := GetArg(optionalArgs, 2, map[string]interface{} {}) _ = params retRes43608 := (<-this.LoadMarkets()) PanicOnError(retRes43608) if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " editOrder() requires a symbol argument"))) } var request interface{} = this.EditOrderRequest(id, symbol, typeVar, side, amount, price, params) response:= (<-this.PrivatePostV5OrderAmend(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "orderId": "c6f055d9-7f21-4079-913d-e6523a9cfffa", // "orderLinkId": "linear-004" // }, // "retExtInfo": {}, // "time": 1672217093461 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) ch <- this.SafeOrder(map[string]interface{} { "info": response, "id": this.SafeString(result, "orderId"), }) return nil }() return ch } /** * @method * @name bybit#editOrders * @description edit a list of trade orders * @see https://bybit-exchange.github.io/docs/v5/order/batch-amend * @param {Array} orders list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) EditOrders(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 retRes43958 := (<-this.LoadMarkets()) PanicOnError(retRes43958) var ordersRequests interface{} = []interface{}{} var orderSymbols interface{} = []interface{}{} for i := 0; IsLessThan(i, GetArrayLength(orders)); i++ { var rawOrder interface{} = GetValue(orders, i) var symbol interface{} = this.SafeString(rawOrder, "symbol") AppendToArray(&orderSymbols,symbol) var id interface{} = this.SafeString(rawOrder, "id") 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.SafeDict(rawOrder, "params", map[string]interface{} {}) var orderRequest interface{} = this.EditOrderRequest(id, symbol, typeVar, side, amount, price, orderParams) Remove(orderRequest, "category") AppendToArray(&ordersRequests,orderRequest) } orderSymbols = this.MarketSymbols(orderSymbols, nil, false, true, true) var market interface{} = this.Market(GetValue(orderSymbols, 0)) var unifiedMarginStatus interface{} = this.SafeInteger(this.Options, "unifiedMarginStatus", 6) var category interface{} = nil categoryparamsVariable := this.GetBybitType("editOrders", market, params); category = GetValue(categoryparamsVariable,0); params = GetValue(categoryparamsVariable,1) if IsTrue(IsTrue((IsEqual(category, "inverse"))) && IsTrue((IsLessThan(unifiedMarginStatus, 5)))) { panic(NotSupported(Add(this.Id, " editOrders does not allow inverse orders for non UTA2.0 account"))) } var request interface{} = map[string]interface{} { "category": category, "request": ordersRequests, } response:= (<-this.PrivatePostV5OrderAmendBatch(this.Extend(request, params))) PanicOnError(response) var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var data interface{} = this.SafeList(result, "list", []interface{}{}) var retInfo interface{} = this.SafeDict(response, "retExtInfo", map[string]interface{} {}) var codes interface{} = this.SafeList(retInfo, "list", []interface{}{}) // extend the error with the unsuccessful orders for i := 0; IsLessThan(i, GetArrayLength(codes)); i++ { var code interface{} = GetValue(codes, i) var retCode interface{} = this.SafeInteger(code, "code") if IsTrue(!IsEqual(retCode, 0)) { AddElementToObject(data, i, this.Extend(GetValue(data, i), code)) } } // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "list": [ // { // "category": "option", // "symbol": "ETH-30DEC22-500-C", // "orderId": "b551f227-7059-4fb5-a6a6-699c04dbd2f2", // "orderLinkId": "" // }, // { // "category": "option", // "symbol": "ETH-30DEC22-700-C", // "orderId": "fa6a595f-1a57-483f-b9d3-30e9c8235a52", // "orderLinkId": "" // } // ] // }, // "retExtInfo": { // "list": [ // { // "code": 0, // "msg": "OK" // }, // { // "code": 0, // "msg": "OK" // } // ] // }, // "time": 1672222808060 // } // ch <- this.ParseOrders(data) return nil }() return ch } func (this *bybit) CancelOrderRequest(id interface{}, optionalArgs ...interface{}) interface{} { symbol := GetArg(optionalArgs, 0, nil) _ = symbol params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } if IsTrue(GetValue(market, "spot")) { // only works for spot market var isTrigger interface{} = this.SafeBool2(params, "stop", "trigger", false) params = this.Omit(params, []interface{}{"stop", "trigger"}) AddElementToObject(request, "orderFilter", Ternary(IsTrue(isTrigger), "StopOrder", "Order")) } if IsTrue(!IsEqual(id, nil)) { AddElementToObject(request, "orderId", id) } if IsTrue(GetValue(market, "spot")) { AddElementToObject(request, "category", "spot") } else if IsTrue(GetValue(market, "linear")) { AddElementToObject(request, "category", "linear") } else if IsTrue(GetValue(market, "inverse")) { AddElementToObject(request, "category", "inverse") } else if IsTrue(GetValue(market, "option")) { AddElementToObject(request, "category", "option") } return this.Extend(request, params) } /** * @method * @name bybit#cancelOrder * @description cancels an open order * @see https://bybit-exchange.github.io/docs/v5/order/cancel-order * @param {string} id order id * @param {string} symbol unified symbol of the market the order was made in * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {boolean} [params.trigger] *spot only* whether the order is a trigger order * @param {boolean} [params.stop] alias for trigger * @param {string} [params.orderFilter] *spot only* 'Order' or 'StopOrder' or 'tpslOrder' * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) CancelOrder(id interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbol := GetArg(optionalArgs, 0, nil) _ = symbol params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " cancelOrder() requires a symbol argument"))) } retRes45228 := (<-this.LoadMarkets()) PanicOnError(retRes45228) var market interface{} = this.Market(symbol) var requestExtended interface{} = this.CancelOrderRequest(id, symbol, params) response:= (<-this.PrivatePostV5OrderCancel(requestExtended)) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "orderId": "c6f055d9-7f21-4079-913d-e6523a9cfffa", // "orderLinkId": "linear-004" // }, // "retExtInfo": {}, // "time": 1672217377164 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) ch <- this.ParseOrder(result, market) return nil }() return ch } /** * @method * @name bybit#cancelOrders * @description cancel multiple orders * @see https://bybit-exchange.github.io/docs/v5/order/batch-cancel * @param {string[]} ids order ids * @param {string} symbol unified symbol of the market the order was made in * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string[]} [params.clientOrderIds] client order ids * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) CancelOrders(ids interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbol := GetArg(optionalArgs, 0, nil) _ = symbol params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " cancelOrders() requires a symbol argument"))) } retRes45578 := (<-this.LoadMarkets()) PanicOnError(retRes45578) var market interface{} = this.Market(symbol) types:= (<-this.IsUnifiedEnabled()) PanicOnError(types) var enableUnifiedAccount interface{} = GetValue(types, 1) if !IsTrue(enableUnifiedAccount) { panic(NotSupported(Add(this.Id, " cancelOrders() supports UTA accounts only"))) } var category interface{} = nil categoryparamsVariable := this.GetBybitType("cancelOrders", market, params); category = GetValue(categoryparamsVariable,0); params = GetValue(categoryparamsVariable,1) if IsTrue(IsEqual(category, "inverse")) { panic(NotSupported(Add(this.Id, " cancelOrders does not allow inverse orders"))) } var ordersRequests interface{} = []interface{}{} var clientOrderIds interface{} = this.SafeList2(params, "clientOrderIds", "clientOids", []interface{}{}) params = this.Omit(params, []interface{}{"clientOrderIds", "clientOids"}) for i := 0; IsLessThan(i, GetArrayLength(clientOrderIds)); i++ { AppendToArray(&ordersRequests,map[string]interface{} { "symbol": GetValue(market, "id"), "orderLinkId": this.SafeString(clientOrderIds, i), }) } for i := 0; IsLessThan(i, GetArrayLength(ids)); i++ { AppendToArray(&ordersRequests,map[string]interface{} { "symbol": GetValue(market, "id"), "orderId": this.SafeString(ids, i), }) } var request interface{} = map[string]interface{} { "category": category, "request": ordersRequests, } response:= (<-this.PrivatePostV5OrderCancelBatch(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": "0", // "retMsg": "OK", // "result": { // "list": [ // { // "category": "spot", // "symbol": "BTCUSDT", // "orderId": "1636282505818800896", // "orderLinkId": "1636282505818800897" // }, // { // "category": "spot", // "symbol": "BTCUSDT", // "orderId": "1636282505818800898", // "orderLinkId": "1636282505818800899" // } // ] // }, // "retExtInfo": { // "list": [ // { // "code": "0", // "msg": "OK" // }, // { // "code": "0", // "msg": "OK" // } // ] // }, // "time": "1709796158501" // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var row interface{} = this.SafeList(result, "list", []interface{}{}) ch <- this.ParseOrders(row, market) return nil }() return ch } /** * @method * @name bybit#cancelAllOrdersAfter * @description dead man's switch, cancel all orders after the given timeout * @see https://bybit-exchange.github.io/docs/v5/order/dcp * @param {number} timeout time in milliseconds * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.product] OPTIONS, DERIVATIVES, SPOT, default is 'DERIVATIVES' * @returns {object} the api result */ func (this *bybit) CancelAllOrdersAfter(timeout 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 retRes46408 := (<-this.LoadMarkets()) PanicOnError(retRes46408) var request interface{} = map[string]interface{} { "timeWindow": this.ParseToInt(Divide(timeout, 1000)), } var typeVar interface{} = nil typeVarparamsVariable := this.HandleMarketTypeAndParams("cancelAllOrdersAfter", nil, params, "swap"); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) var productMap interface{} = map[string]interface{} { "spot": "SPOT", "swap": "DERIVATIVES", "option": "OPTIONS", } var product interface{} = this.SafeString(productMap, typeVar, typeVar) AddElementToObject(request, "product", product) response:= (<-this.PrivatePostV5OrderDisconnectedCancelAll(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success" // } // ch <- response return nil }() return ch } /** * @method * @name bybit#cancelOrdersForSymbols * @description cancel multiple orders for multiple symbols * @see https://bybit-exchange.github.io/docs/v5/order/batch-cancel * @param {CancellationRequest[]} orders list of order ids with symbol, example [{"id": "a", "symbol": "BTC/USDT"}, {"id": "b", "symbol": "ETH/USDT"}] * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) CancelOrdersForSymbols(orders interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes46738 := (<-this.LoadMarkets()) PanicOnError(retRes46738) types:= (<-this.IsUnifiedEnabled()) PanicOnError(types) var enableUnifiedAccount interface{} = GetValue(types, 1) if !IsTrue(enableUnifiedAccount) { panic(NotSupported(Add(this.Id, " cancelOrdersForSymbols() supports UTA accounts only"))) } var ordersRequests interface{} = []interface{}{} var category interface{} = nil for i := 0; IsLessThan(i, GetArrayLength(orders)); i++ { var order interface{} = GetValue(orders, i) var symbol interface{} = this.SafeString(order, "symbol") var market interface{} = this.Market(symbol) var currentCategory interface{} = nil currentCategoryparamsVariable := this.GetBybitType("cancelOrders", market, params); currentCategory = GetValue(currentCategoryparamsVariable,0); params = GetValue(currentCategoryparamsVariable,1) if IsTrue(IsEqual(currentCategory, "inverse")) { panic(NotSupported(Add(this.Id, " cancelOrdersForSymbols does not allow inverse orders"))) } if IsTrue(IsTrue((!IsEqual(category, nil))) && IsTrue((!IsEqual(category, currentCategory)))) { panic(ExchangeError(Add(this.Id, " cancelOrdersForSymbols requires all orders to be of the same category (linear, spot or option))"))) } category = currentCategory var id interface{} = this.SafeString(order, "id") var clientOrderId interface{} = this.SafeString(order, "clientOrderId") var idKey interface{} = "orderId" if IsTrue(!IsEqual(clientOrderId, nil)) { idKey = "orderLinkId" } var orderItem interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } AddElementToObject(orderItem, idKey, Ternary(IsTrue((IsEqual(idKey, "orderId"))), id, clientOrderId)) AppendToArray(&ordersRequests,orderItem) } var request interface{} = map[string]interface{} { "category": category, "request": ordersRequests, } response:= (<-this.PrivatePostV5OrderCancelBatch(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": "0", // "retMsg": "OK", // "result": { // "list": [ // { // "category": "spot", // "symbol": "BTCUSDT", // "orderId": "1636282505818800896", // "orderLinkId": "1636282505818800897" // }, // { // "category": "spot", // "symbol": "BTCUSDT", // "orderId": "1636282505818800898", // "orderLinkId": "1636282505818800899" // } // ] // }, // "retExtInfo": { // "list": [ // { // "code": "0", // "msg": "OK" // }, // { // "code": "0", // "msg": "OK" // } // ] // }, // "time": "1709796158501" // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var row interface{} = this.SafeList(result, "list", []interface{}{}) ch <- this.ParseOrders(row, nil) return nil }() return ch } /** * @method * @name bybit#cancelAllOrders * @description cancel all open orders * @see https://bybit-exchange.github.io/docs/v5/order/cancel-all * @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 {boolean} [params.trigger] true if trigger order * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.baseCoin] Base coin. Supports linear, inverse & option * @param {string} [params.settleCoin] Settle coin. Supports linear, inverse & option * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) 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 retRes47678 := (<-this.LoadMarkets()) PanicOnError(retRes47678) enableUnifiedMarginenableUnifiedAccountVariable := (<-this.IsUnifiedEnabled()); enableUnifiedMargin := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,0); enableUnifiedAccount := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,1) var isUnifiedAccount interface{} = (IsTrue(enableUnifiedMargin) || IsTrue(enableUnifiedAccount)) 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")) } var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("cancelAllOrders", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) AddElementToObject(request, "category", typeVar) if IsTrue(IsTrue((IsEqual(typeVar, "option"))) && !IsTrue(isUnifiedAccount)) { panic(NotSupported(Add(Add(Add(this.Id, " cancelAllOrders() Normal Account not support "), typeVar), " market"))) } if IsTrue(IsTrue((IsEqual(typeVar, "linear"))) || IsTrue((IsEqual(typeVar, "inverse")))) { var baseCoin interface{} = this.SafeString(params, "baseCoin") if IsTrue(IsTrue(IsEqual(symbol, nil)) && IsTrue(IsEqual(baseCoin, nil))) { var defaultSettle interface{} = this.SafeString(this.Options, "defaultSettle", "USDT") AddElementToObject(request, "settleCoin", this.SafeString(params, "settleCoin", defaultSettle)) } } var isTrigger interface{} = this.SafeBool2(params, "stop", "trigger", false) params = this.Omit(params, []interface{}{"stop", "trigger"}) if IsTrue(isTrigger) { AddElementToObject(request, "orderFilter", "StopOrder") } response:= (<-this.PrivatePostV5OrderCancelAll(this.Extend(request, params))) PanicOnError(response) // // linear / inverse / option // { // "retCode": 0, // "retMsg": "OK", // "result": { // "list": [ // { // "orderId": "f6a73e1f-39b5-4dee-af21-1460b2e3b27c", // "orderLinkId": "a001" // } // ] // }, // "retExtInfo": {}, // "time": 1672219780463 // } // // spot // { // "retCode": 0, // "retMsg": "OK", // "result": { // "success": "1" // }, // "retExtInfo": {}, // "time": 1676962409398 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var orders interface{} = this.SafeList(result, "list") if !IsTrue(IsArray(orders)) { ch <- response return nil } ch <- this.ParseOrders(orders, market) return nil }() return ch } /** * @method * @name bybit#fetchOrderClassic * @description fetches information on an order made by the user *classic accounts only* * @see https://bybit-exchange.github.io/docs/v5/order/order-list * @param {string} id the order id * @param {string} symbol unified symbol of the market the order was made in * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) FetchOrderClassic(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"))) } retRes48458 := (<-this.LoadMarkets()) PanicOnError(retRes48458) var market interface{} = this.Market(symbol) if IsTrue(GetValue(market, "spot")) { panic(NotSupported(Add(this.Id, " fetchOrder() is not supported for spot markets"))) } var request interface{} = map[string]interface{} { "orderId": id, } result:= (<-this.FetchOrders(symbol, nil, nil, this.Extend(request, params))) PanicOnError(result) var length interface{} = GetArrayLength(result) if IsTrue(IsEqual(length, 0)) { var isTrigger interface{} = this.SafeBoolN(params, []interface{}{"trigger", "stop"}, false) var extra interface{} = Ternary(IsTrue(isTrigger), "", " If you are trying to fetch SL/TP conditional order, you might try setting params[\"trigger\"] = true") panic(OrderNotFound(Add(Add(Add("Order ", ToString(id)), " was not found."), extra))) } if IsTrue(IsGreaterThan(length, 1)) { panic(InvalidOrder(Add(this.Id, " returned more than one order"))) } ch <- this.SafeValue(result, 0) return nil }() return ch } /** * @method * @name bybit#fetchOrder * @description *classic accounts only/ spot not supported* fetches information on an order made by the user *classic accounts only* * @see https://bybit-exchange.github.io/docs/v5/order/order-list * @param {string} id the order id * @param {string} symbol unified symbol of the market the order was made in * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {object} [params.acknowledged] to suppress the warning, set to true * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) 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 retRes48788 := (<-this.LoadMarkets()) PanicOnError(retRes48788) enableUnifiedMarginenableUnifiedAccountVariable := (<-this.IsUnifiedEnabled()); enableUnifiedMargin := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,0); enableUnifiedAccount := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,1) var isUnifiedAccount interface{} = (IsTrue(enableUnifiedMargin) || IsTrue(enableUnifiedAccount)) if !IsTrue(isUnifiedAccount) { retRes488219 := (<-this.FetchOrderClassic(id, symbol, params)) PanicOnError(retRes488219) ch <- retRes488219 return nil } var acknowledge interface{} = false acknowledgeparamsVariable := this.HandleOptionAndParams(params, "fetchOrder", "acknowledged"); acknowledge = GetValue(acknowledgeparamsVariable,0); params = GetValue(acknowledgeparamsVariable,1) if !IsTrue(acknowledge) { panic(ArgumentsRequired(Add(this.Id, " fetchOrder() can only access an order if it is in last 500 orders (of any status) for your account. Set params[\"acknowledged\"] = true to hide this warning. Alternatively, we suggest to use fetchOpenOrder or fetchClosedOrder"))) } var market interface{} = this.Market(symbol) var marketType interface{} = nil marketTypeparamsVariable := this.GetBybitType("fetchOrder", market, params); marketType = GetValue(marketTypeparamsVariable,0); params = GetValue(marketTypeparamsVariable,1) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), "orderId": id, "category": marketType, } var isTrigger interface{} = nil isTriggerparamsVariable := this.HandleParamBool2(params, "trigger", "stop", false); isTrigger = GetValue(isTriggerparamsVariable,0); params = GetValue(isTriggerparamsVariable,1) if IsTrue(isTrigger) { AddElementToObject(request, "orderFilter", "StopOrder") } response:= (<-this.PrivateGetV5OrderRealtime(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "nextPageCursor": "1321052653536515584%3A1672217748287%2C1321052653536515584%3A1672217748287", // "category": "spot", // "list": [ // { // "symbol": "ETHUSDT", // "orderType": "Limit", // "orderLinkId": "1672217748277652", // "orderId": "1321052653536515584", // "cancelType": "UNKNOWN", // "avgPrice": "", // "stopOrderType": "tpslOrder", // "lastPriceOnCreated": "", // "orderStatus": "Cancelled", // "takeProfit": "", // "cumExecValue": "0", // "triggerDirection": 0, // "isLeverage": "0", // "rejectReason": "", // "price": "1000", // "orderIv": "", // "createdTime": "1672217748287", // "tpTriggerBy": "", // "positionIdx": 0, // "timeInForce": "GTC", // "leavesValue": "500", // "updatedTime": "1672217748287", // "side": "Buy", // "triggerPrice": "1500", // "cumExecFee": "0", // "leavesQty": "0", // "slTriggerBy": "", // "closeOnTrigger": false, // "cumExecQty": "0", // "reduceOnly": false, // "qty": "0.5", // "stopLoss": "", // "triggerBy": "1192.5" // } // ] // }, // "retExtInfo": {}, // "time": 1672219526294 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var innerList interface{} = this.SafeList(result, "list", []interface{}{}) if IsTrue(IsEqual(GetArrayLength(innerList), 0)) { var extra interface{} = Ternary(IsTrue(isTrigger), "", " If you are trying to fetch SL/TP conditional order, you might try setting params[\"trigger\"] = true") panic(OrderNotFound(Add(Add(Add("Order ", ToString(id)), " was not found."), extra))) } var order interface{} = this.SafeDict(innerList, 0, map[string]interface{} {}) ch <- this.ParseOrder(order, market) return nil }() return ch } func (this *bybit) 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 res:= (<-this.IsUnifiedEnabled()) PanicOnError(res) /** * @method * @name bybit#fetchOrders * @description *classic accounts only/ spot not supported* fetches information on multiple orders made by the user *classic accounts only/ spot not supported* * @see https://bybit-exchange.github.io/docs/v5/order/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 {boolean} [params.trigger] true if trigger order * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.orderFilter] 'Order' or 'StopOrder' or 'tpslOrder' * @param {int} [params.until] the latest time in ms to fetch entries for * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ var enableUnifiedAccount interface{} = this.SafeBool(res, 1) if IsTrue(enableUnifiedAccount) { panic(NotSupported(Add(this.Id, " fetchOrders() is not supported after the 5/02 update for UTA accounts, please use fetchOpenOrders, fetchClosedOrders or fetchCanceledOrders"))) } retRes498615 := (<-this.FetchOrdersClassic(symbol, since, limit, params)) PanicOnError(retRes498615) ch <- retRes498615 return nil }() return ch } /** * @method * @name bybit#fetchOrdersClassic * @description fetches information on multiple orders made by the user *classic accounts only* * @see https://bybit-exchange.github.io/docs/v5/order/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 {boolean} [params.trigger] true if trigger order * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.orderFilter] 'Order' or 'StopOrder' or 'tpslOrder' * @param {int} [params.until] the latest time in ms to fetch entries for * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) FetchOrdersClassic(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 retRes50088 := (<-this.LoadMarkets()) PanicOnError(retRes50088) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchOrders", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes501219 := (<-this.FetchPaginatedCallCursor("fetchOrders", symbol, since, limit, params, "nextPageCursor", "cursor", nil, 50)) PanicOnError(retRes501219) ch <- retRes501219 return nil } 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 typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchOrders", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(IsEqual(typeVar, "spot")) { panic(NotSupported(Add(this.Id, " fetchOrders() is not supported for spot markets"))) } AddElementToObject(request, "category", typeVar) var isTrigger interface{} = this.SafeBoolN(params, []interface{}{"trigger", "stop"}, false) params = this.Omit(params, []interface{}{"trigger", "stop"}) if IsTrue(isTrigger) { AddElementToObject(request, "orderFilter", "StopOrder") } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } var until interface{} = this.SafeInteger(params, "until") // unified in milliseconds var endTime interface{} = this.SafeInteger(params, "endTime", until) // exchange-specific in milliseconds params = this.Omit(params, []interface{}{"endTime", "until"}) if IsTrue(!IsEqual(endTime, nil)) { AddElementToObject(request, "endTime", endTime) } response:= (<-this.PrivateGetV5OrderHistory(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "nextPageCursor": "03234de9-1332-41eb-b805-4a9f42c136a3%3A1672220109387%2C03234de9-1332-41eb-b805-4a9f42c136a3%3A1672220109387", // "category": "linear", // "list": [ // { // "symbol": "BTCUSDT", // "orderType": "Limit", // "orderLinkId": "test-001", // "orderId": "03234de9-1332-41eb-b805-4a9f42c136a3", // "cancelType": "CancelByUser", // "avgPrice": "0", // "stopOrderType": "UNKNOWN", // "lastPriceOnCreated": "16656.5", // "orderStatus": "Cancelled", // "takeProfit": "", // "cumExecValue": "0", // "triggerDirection": 0, // "blockTradeId": "", // "rejectReason": "EC_PerCancelRequest", // "isLeverage": "", // "price": "18000", // "orderIv": "", // "createdTime": "1672220109387", // "tpTriggerBy": "UNKNOWN", // "positionIdx": 0, // "timeInForce": "GoodTillCancel", // "leavesValue": "0", // "updatedTime": "1672220114123", // "side": "Sell", // "triggerPrice": "", // "cumExecFee": "0", // "slTriggerBy": "UNKNOWN", // "leavesQty": "0", // "closeOnTrigger": false, // "cumExecQty": "0", // "reduceOnly": false, // "qty": "0.1", // "stopLoss": "", // "triggerBy": "UNKNOWN" // } // ] // }, // "retExtInfo": {}, // "time": 1672221263862 // } // var data interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseOrders(data, market, since, limit) return nil }() return ch } /** * @method * @name bybit#fetchClosedOrder * @description fetches information on a closed order made by the user * @see https://bybit-exchange.github.io/docs/v5/order/order-list * @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 {boolean} [params.trigger] set to true for fetching a closed trigger order * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.orderFilter] 'Order' or 'StopOrder' or 'tpslOrder' * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) FetchClosedOrder(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 retRes51148 := (<-this.LoadMarkets()) PanicOnError(retRes51148) var request interface{} = map[string]interface{} { "orderId": id, } result:= (<-this.FetchClosedOrders(symbol, nil, nil, this.Extend(request, params))) PanicOnError(result) var length interface{} = GetArrayLength(result) if IsTrue(IsEqual(length, 0)) { var isTrigger interface{} = this.SafeBoolN(params, []interface{}{"trigger", "stop"}, false) var extra interface{} = Ternary(IsTrue(isTrigger), "", " If you are trying to fetch SL/TP conditional order, you might try setting params[\"trigger\"] = true") panic(OrderNotFound(Add(Add(Add("Order ", ToString(id)), " was not found."), extra))) } if IsTrue(IsGreaterThan(length, 1)) { panic(InvalidOrder(Add(this.Id, " returned more than one order"))) } ch <- this.SafeValue(result, 0) return nil }() return ch } /** * @method * @name bybit#fetchOpenOrder * @description fetches information on an open order made by the user * @see https://bybit-exchange.github.io/docs/v5/order/open-order * @param {string} id order id * @param {string} [symbol] unified symbol of the market the order was made in * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {boolean} [params.trigger] set to true for fetching an open trigger order * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.baseCoin] Base coin. Supports linear, inverse & option * @param {string} [params.settleCoin] Settle coin. Supports linear, inverse & option * @param {string} [params.orderFilter] 'Order' or 'StopOrder' or 'tpslOrder' * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) FetchOpenOrder(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 retRes51498 := (<-this.LoadMarkets()) PanicOnError(retRes51498) var request interface{} = map[string]interface{} { "orderId": id, } result:= (<-this.FetchOpenOrders(symbol, nil, nil, this.Extend(request, params))) PanicOnError(result) var length interface{} = GetArrayLength(result) if IsTrue(IsEqual(length, 0)) { var isTrigger interface{} = this.SafeBoolN(params, []interface{}{"trigger", "stop"}, false) var extra interface{} = Ternary(IsTrue(isTrigger), "", " If you are trying to fetch SL/TP conditional order, you might try setting params[\"trigger\"] = true") panic(OrderNotFound(Add(Add(Add("Order ", ToString(id)), " was not found."), extra))) } if IsTrue(IsGreaterThan(length, 1)) { panic(InvalidOrder(Add(this.Id, " returned more than one order"))) } ch <- this.SafeValue(result, 0) return nil }() return ch } /** * @method * @name bybit#fetchCanceledAndClosedOrders * @description fetches information on multiple canceled and closed orders made by the user * @see https://bybit-exchange.github.io/docs/v5/order/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 {boolean} [params.trigger] set to true for fetching trigger orders * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.orderFilter] 'Order' or 'StopOrder' or 'tpslOrder' * @param {int} [params.until] the latest time in ms to fetch entries for * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) FetchCanceledAndClosedOrders(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbol := GetArg(optionalArgs, 0, nil) _ = symbol since := GetArg(optionalArgs, 1, nil) _ = since limit := GetArg(optionalArgs, 2, nil) _ = limit params := GetArg(optionalArgs, 3, map[string]interface{} {}) _ = params retRes51858 := (<-this.LoadMarkets()) PanicOnError(retRes51858) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchCanceledAndClosedOrders", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes518919 := (<-this.FetchPaginatedCallCursor("fetchCanceledAndClosedOrders", symbol, since, limit, params, "nextPageCursor", "cursor", nil, 50)) PanicOnError(retRes518919) ch <- retRes518919 return nil } 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 typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchCanceledAndClosedOrders", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) AddElementToObject(request, "category", typeVar) var isTrigger interface{} = this.SafeBoolN(params, []interface{}{"trigger", "stop"}, false) params = this.Omit(params, []interface{}{"trigger", "stop"}) if IsTrue(isTrigger) { AddElementToObject(request, "orderFilter", "StopOrder") } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } var until interface{} = this.SafeInteger(params, "until") // unified in milliseconds var endTime interface{} = this.SafeInteger(params, "endTime", until) // exchange-specific in milliseconds params = this.Omit(params, []interface{}{"endTime", "until"}) if IsTrue(!IsEqual(endTime, nil)) { AddElementToObject(request, "endTime", endTime) } response:= (<-this.PrivateGetV5OrderHistory(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "nextPageCursor": "03234de9-1332-41eb-b805-4a9f42c136a3%3A1672220109387%2C03234de9-1332-41eb-b805-4a9f42c136a3%3A1672220109387", // "category": "linear", // "list": [ // { // "symbol": "BTCUSDT", // "orderType": "Limit", // "orderLinkId": "test-001", // "orderId": "03234de9-1332-41eb-b805-4a9f42c136a3", // "cancelType": "CancelByUser", // "avgPrice": "0", // "stopOrderType": "UNKNOWN", // "lastPriceOnCreated": "16656.5", // "orderStatus": "Cancelled", // "takeProfit": "", // "cumExecValue": "0", // "triggerDirection": 0, // "blockTradeId": "", // "rejectReason": "EC_PerCancelRequest", // "isLeverage": "", // "price": "18000", // "orderIv": "", // "createdTime": "1672220109387", // "tpTriggerBy": "UNKNOWN", // "positionIdx": 0, // "timeInForce": "GoodTillCancel", // "leavesValue": "0", // "updatedTime": "1672220114123", // "side": "Sell", // "triggerPrice": "", // "cumExecFee": "0", // "slTriggerBy": "UNKNOWN", // "leavesQty": "0", // "closeOnTrigger": false, // "cumExecQty": "0", // "reduceOnly": false, // "qty": "0.1", // "stopLoss": "", // "triggerBy": "UNKNOWN" // } // ] // }, // "retExtInfo": {}, // "time": 1672221263862 // } // var data interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseOrders(data, market, since, limit) return nil }() return ch } /** * @method * @name bybit#fetchClosedOrders * @description fetches information on multiple closed orders made by the user * @see https://bybit-exchange.github.io/docs/v5/order/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 {boolean} [params.trigger] set to true for fetching closed trigger orders * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.orderFilter] 'Order' or 'StopOrder' or 'tpslOrder' * @param {int} [params.until] the latest time in ms to fetch entries for * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) 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 retRes52918 := (<-this.LoadMarkets()) PanicOnError(retRes52918) var request interface{} = map[string]interface{} { "orderStatus": "Filled", } retRes529515 := (<-this.FetchCanceledAndClosedOrders(symbol, since, limit, this.Extend(request, params))) PanicOnError(retRes529515) ch <- retRes529515 return nil }() return ch } /** * @method * @name bybit#fetchCanceledOrders * @description fetches information on multiple canceled orders made by the user * @see https://bybit-exchange.github.io/docs/v5/order/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 * @param {boolean} [params.trigger] true if trigger order * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.orderFilter] 'Order' or 'StopOrder' or 'tpslOrder' * @param {int} [params.until] the latest time in ms to fetch entries for * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {object} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) 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 retRes53178 := (<-this.LoadMarkets()) PanicOnError(retRes53178) var request interface{} = map[string]interface{} { "orderStatus": "Cancelled", } retRes532115 := (<-this.FetchCanceledAndClosedOrders(symbol, since, limit, this.Extend(request, params))) PanicOnError(retRes532115) ch <- retRes532115 return nil }() return ch } /** * @method * @name bybit#fetchOpenOrders * @description fetch all unfilled currently open orders * @see https://bybit-exchange.github.io/docs/v5/order/open-order * @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 {boolean} [params.trigger] set to true for fetching open trigger orders * @param {boolean} [params.stop] alias for trigger * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.baseCoin] Base coin. Supports linear, inverse & option * @param {string} [params.settleCoin] Settle coin. Supports linear, inverse & option * @param {string} [params.orderFilter] 'Order' or 'StopOrder' or 'tpslOrder' * @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 {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure} */ func (this *bybit) 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 retRes53448 := (<-this.LoadMarkets()) PanicOnError(retRes53448) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchOpenOrders", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes534819 := (<-this.FetchPaginatedCallCursor("fetchOpenOrders", symbol, since, limit, params, "nextPageCursor", "cursor", nil, 50)) PanicOnError(retRes534819) ch <- retRes534819 return nil } 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 typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchOpenOrders", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(IsTrue(IsEqual(typeVar, "linear")) || IsTrue(IsEqual(typeVar, "inverse"))) { var baseCoin interface{} = this.SafeString(params, "baseCoin") if IsTrue(IsTrue(IsEqual(symbol, nil)) && IsTrue(IsEqual(baseCoin, nil))) { var defaultSettle interface{} = this.SafeString(this.Options, "defaultSettle", "USDT") var settleCoin interface{} = this.SafeString(params, "settleCoin", defaultSettle) AddElementToObject(request, "settleCoin", settleCoin) } } AddElementToObject(request, "category", typeVar) var isTrigger interface{} = this.SafeBool2(params, "stop", "trigger", false) params = this.Omit(params, []interface{}{"stop", "trigger"}) if IsTrue(isTrigger) { AddElementToObject(request, "orderFilter", "StopOrder") } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } response:= (<-this.PrivateGetV5OrderRealtime(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "nextPageCursor": "1321052653536515584%3A1672217748287%2C1321052653536515584%3A1672217748287", // "category": "spot", // "list": [ // { // "symbol": "ETHUSDT", // "orderType": "Limit", // "orderLinkId": "1672217748277652", // "orderId": "1321052653536515584", // "cancelType": "UNKNOWN", // "avgPrice": "", // "stopOrderType": "tpslOrder", // "lastPriceOnCreated": "", // "orderStatus": "Cancelled", // "takeProfit": "", // "cumExecValue": "0", // "triggerDirection": 0, // "isLeverage": "0", // "rejectReason": "", // "price": "1000", // "orderIv": "", // "createdTime": "1672217748287", // "tpTriggerBy": "", // "positionIdx": 0, // "timeInForce": "GTC", // "leavesValue": "500", // "updatedTime": "1672217748287", // "side": "Buy", // "triggerPrice": "1500", // "cumExecFee": "0", // "leavesQty": "0", // "slTriggerBy": "", // "closeOnTrigger": false, // "cumExecQty": "0", // "reduceOnly": false, // "qty": "0.5", // "stopLoss": "", // "triggerBy": "1192.5" // } // ] // }, // "retExtInfo": {}, // "time": 1672219526294 // } // var data interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseOrders(data, market, since, limit) return nil }() return ch } /** * @method * @name bybit#fetchOrderTrades * @description fetch all the trades made from a single order * @see https://bybit-exchange.github.io/docs/v5/position/execution * @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 *bybit) 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 var request interface{} = map[string]interface{} {} var clientOrderId interface{} = this.SafeString2(params, "clientOrderId", "orderLinkId") if IsTrue(!IsEqual(clientOrderId, nil)) { AddElementToObject(request, "orderLinkId", clientOrderId) } else { AddElementToObject(request, "orderId", id) } params = this.Omit(params, []interface{}{"clientOrderId", "orderLinkId"}) retRes545015 := (<-this.FetchMyTrades(symbol, since, limit, this.Extend(request, params))) PanicOnError(retRes545015) ch <- retRes545015 return nil }() return ch } /** * @method * @name bybit#fetchMyTrades * @description fetch all trades made by the user * @see https://bybit-exchange.github.io/docs/api-explorer/v5/position/execution * @param {string} symbol unified market symbol * @param {int} [since] the earliest time in ms to fetch trades for * @param {int} [limit] the maximum number of trades structures to retrieve * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure} */ func (this *bybit) 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 retRes54688 := (<-this.LoadMarkets()) PanicOnError(retRes54688) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchMyTrades", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes547219 := (<-this.FetchPaginatedCallCursor("fetchMyTrades", symbol, since, limit, params, "nextPageCursor", "cursor", nil, 100)) PanicOnError(retRes547219) ch <- retRes547219 return nil } var request interface{} = map[string]interface{} { "execType": "Trade", } var market interface{} = nil if IsTrue(!IsEqual(symbol, nil)) { market = this.Market(symbol) AddElementToObject(request, "symbol", GetValue(market, "id")) } var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchMyTrades", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) AddElementToObject(request, "category", typeVar) if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } requestparamsVariable := this.HandleUntilOption("endTime", request, params); request = GetValue(requestparamsVariable,0); params = GetValue(requestparamsVariable,1) response:= (<-this.PrivateGetV5ExecutionList(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "nextPageCursor": "132766%3A2%2C132766%3A2", // "category": "linear", // "list": [ // { // "symbol": "ETHPERP", // "orderType": "Market", // "underlyingPrice": "", // "orderLinkId": "", // "side": "Buy", // "indexPrice": "", // "orderId": "8c065341-7b52-4ca9-ac2c-37e31ac55c94", // "stopOrderType": "UNKNOWN", // "leavesQty": "0", // "execTime": "1672282722429", // "isMaker": false, // "execFee": "0.071409", // "feeRate": "0.0006", // "execId": "e0cbe81d-0f18-5866-9415-cf319b5dab3b", // "tradeIv": "", // "blockTradeId": "", // "markPrice": "1183.54", // "execPrice": "1190.15", // "markIv": "", // "orderQty": "0.1", // "orderPrice": "1236.9", // "execValue": "119.015", // "execType": "Trade", // "execQty": "0.1" // } // ] // }, // "retExtInfo": {}, // "time": 1672283754510 // } // var trades interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseTrades(trades, market, since, limit) return nil }() return ch } func (this *bybit) ParseDepositAddress(depositAddress interface{}, optionalArgs ...interface{}) interface{} { // // { // "chainType": "ERC20", // "addressDeposit": "0xf56297c6717c1d1c42c30324468ed50a9b7402ee", // "tagDeposit": '', // "chain": "ETH" // } // currency := GetArg(optionalArgs, 0, nil) _ = currency var address interface{} = this.SafeString(depositAddress, "addressDeposit") var tag interface{} = this.SafeString(depositAddress, "tagDeposit") var code interface{} = this.SafeString(currency, "code") this.CheckAddress(address) return map[string]interface{} { "info": depositAddress, "currency": code, "network": this.NetworkIdToCode(this.SafeString(depositAddress, "chain"), code), "address": address, "tag": tag, } } /** * @method * @name bybit#fetchDepositAddressesByNetwork * @description fetch a dictionary of addresses for a currency, indexed by network * @see https://bybit-exchange.github.io/docs/v5/asset/master-deposit-addr * @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 *bybit) 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 retRes55698 := (<-this.LoadMarkets()) PanicOnError(retRes55698) var currency interface{} = this.Currency(code) var request interface{} = map[string]interface{} { "coin": GetValue(currency, "id"), } var networkCode interface{} = nil networkCodeparamsVariable := this.HandleNetworkCodeAndParams(params); networkCode = GetValue(networkCodeparamsVariable,0); params = GetValue(networkCodeparamsVariable,1) if IsTrue(!IsEqual(networkCode, nil)) { AddElementToObject(request, "chainType", this.NetworkCodeToId(networkCode, code)) } response:= (<-this.PrivateGetV5AssetDepositQueryAddress(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "coin": "USDT", // "chains": [ // { // "chainType": "ERC20", // "addressDeposit": "0xd9e1cd77afa0e50b452a62fbb68a3340602286c3", // "tagDeposit": "", // "chain": "ETH" // } // ] // }, // "retExtInfo": {}, // "time": 1672192792860 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var chains interface{} = this.SafeList(result, "chains", []interface{}{}) var coin interface{} = this.SafeString(result, "coin") currency = this.Currency(coin) var parsed interface{} = this.ParseDepositAddresses(chains, []interface{}{GetValue(currency, "code")}, false, map[string]interface{} { "currency": GetValue(currency, "code"), }) ch <- this.IndexBy(parsed, "network") return nil }() return ch } /** * @method * @name bybit#fetchDepositAddress * @description fetch the deposit address for a currency associated with this account * @see https://bybit-exchange.github.io/docs/v5/asset/master-deposit-addr * @param {string} code unified currency code * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure} */ func (this *bybit) 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 retRes56198 := (<-this.LoadMarkets()) PanicOnError(retRes56198) var currency interface{} = this.Currency(code) networkCodeparamsOmitedVariable := this.HandleNetworkCodeAndParams(params); networkCode := GetValue(networkCodeparamsOmitedVariable,0); paramsOmited := GetValue(networkCodeparamsOmitedVariable,1) indexedAddresses:= (<-this.FetchDepositAddressesByNetwork(code, paramsOmited)) PanicOnError(indexedAddresses) var selectedNetworkCode interface{} = this.SelectNetworkCodeFromUnifiedNetworks(GetValue(currency, "code"), networkCode, indexedAddresses) ch <- GetValue(indexedAddresses, selectedNetworkCode) return nil }() return ch } /** * @method * @name bybit#fetchDeposits * @description fetch all deposits made to an account * @see https://bybit-exchange.github.io/docs/v5/asset/deposit-record * @param {string} code unified currency code * @param {int} [since] the earliest time in ms to fetch deposits for, default = 30 days before the current time * @param {int} [limit] the maximum number of deposits structures to retrieve, default = 50, max = 50 * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {int} [params.until] the latest time in ms to fetch deposits for, default = 30 days after since * EXCHANGE SPECIFIC PARAMETERS * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @param {string} [params.cursor] used for pagination * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure} */ func (this *bybit) 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 retRes56438 := (<-this.LoadMarkets()) PanicOnError(retRes56438) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchDeposits", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes564719 := (<-this.FetchPaginatedCallCursor("fetchDeposits", code, since, limit, params, "nextPageCursor", "cursor", nil, 50)) PanicOnError(retRes564719) ch <- retRes564719 return nil } 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)) { AddElementToObject(request, "limit", limit) } requestparamsVariable := this.HandleUntilOption("endTime", request, params); request = GetValue(requestparamsVariable,0); params = GetValue(requestparamsVariable,1) response:= (<-this.PrivateGetV5AssetDepositQueryRecord(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "rows": [ // { // "coin": "USDT", // "chain": "ETH", // "amount": "10000", // "txID": "skip-notification-scene-test-amount-202212270944-533285-USDT", // "status": 3, // "toAddress": "test-amount-address", // "tag": "", // "depositFee": "", // "successAt": "1672134274000", // "confirmations": "10000", // "txIndex": "", // "blockHash": "" // } // ], // "nextPageCursor": "eyJtaW5JRCI6MTA0NjA0MywibWF4SUQiOjEwNDYwNDN9" // }, // "retExtInfo": {}, // "time": 1672191992512 // } // var data interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseTransactions(data, currency, since, limit) return nil }() return ch } /** * @method * @name bybit#fetchWithdrawals * @description fetch all withdrawals made from an account * @see https://bybit-exchange.github.io/docs/v5/asset/withdraw-record * @param {string} code unified currency code * @param {int} [since] the earliest time in ms to fetch withdrawals for * @param {int} [limit] the maximum number of withdrawals structures to retrieve * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {int} [params.until] the latest time in ms to fetch entries for * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {object[]} a list of [transaction structures]{@link https://docs.ccxt.com/#/?id=transaction-structure} */ func (this *bybit) 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 retRes57128 := (<-this.LoadMarkets()) PanicOnError(retRes57128) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchWithdrawals", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes571619 := (<-this.FetchPaginatedCallCursor("fetchWithdrawals", code, since, limit, params, "nextPageCursor", "cursor", nil, 50)) PanicOnError(retRes571619) ch <- retRes571619 return nil } 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)) { AddElementToObject(request, "limit", limit) } requestparamsVariable := this.HandleUntilOption("endTime", request, params); request = GetValue(requestparamsVariable,0); params = GetValue(requestparamsVariable,1) response:= (<-this.PrivateGetV5AssetWithdrawQueryRecord(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "rows": [ // { // "coin": "USDT", // "chain": "ETH", // "amount": "77", // "txID": "", // "status": "SecurityCheck", // "toAddress": "0x99ced129603abc771c0dabe935c326ff6c86645d", // "tag": "", // "withdrawFee": "10", // "createTime": "1670922217000", // "updateTime": "1670922217000", // "withdrawId": "9976", // "withdrawType": 0 // }, // { // "coin": "USDT", // "chain": "ETH", // "amount": "26", // "txID": "", // "status": "success", // "toAddress": "15638072681@163.com", // "tag": "", // "withdrawFee": "0", // "createTime": "1669711121000", // "updateTime": "1669711380000", // "withdrawId": "9801", // "withdrawType": 1 // } // ], // "nextPageCursor": "eyJtaW5JRCI6OTgwMSwibWF4SUQiOjk5NzZ9" // }, // "retExtInfo": {}, // "time": 1672194949928 // } // var data interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseTransactions(data, currency, since, limit) return nil }() return ch } func (this *bybit) ParseTransactionStatus(status interface{}) interface{} { var statuses interface{} = map[string]interface{} { "0": "unknown", "1": "pending", "2": "processing", "3": "ok", "4": "fail", "SecurityCheck": "pending", "Pending": "pending", "success": "ok", "CancelByUser": "canceled", "Reject": "rejected", "Fail": "failed", "BlockchainConfirmed": "ok", } return this.SafeString(statuses, status, status) } func (this *bybit) ParseTransaction(transaction interface{}, optionalArgs ...interface{}) interface{} { // // fetchWithdrawals // // { // "coin": "USDT", // "chain": "TRX", // "amount": "12.34", // "txID": "de5ea0a2f2e59dc9a714837dd3ddc6d5e151b56ec5d786d351c4f52336f80d3c", // "status": "success", // "toAddress": "TQdmFKUoe1Lk2iwZuwRJEHJreTUBoN3BAw", // "tag": "", // "withdrawFee": "0.5", // "createTime": "1665144183000", // "updateTime": "1665144256000", // "withdrawId": "8839035" // } // // fetchDeposits // // { // "coin": "USDT", // "chain": "TRX", // "amount": "44", // "txID": "0b038ea12fa1575e2d66693db3c346b700d4b28347afc39f80321cf089acc960", // "status": "3", // "toAddress": "TC6NCAC5WSVCCiaD3kWZXyW91ZKKhLm53b", // "tag": "", // "depositFee": "", // "successAt": "1665142507000", // "confirmations": "100", // "txIndex": "0", // "blockHash": "0000000002ac3b1064aee94bca1bd0b58c4c09c65813b084b87a2063d961129e" // } // // withdraw // // { // "id": "9377266" // } // currency := GetArg(optionalArgs, 0, nil) _ = currency var currencyId interface{} = this.SafeString(transaction, "coin") var code interface{} = this.SafeCurrencyCode(currencyId, currency) var timestamp interface{} = this.SafeInteger2(transaction, "createTime", "successAt") var updated interface{} = this.SafeInteger(transaction, "updateTime") var status interface{} = this.ParseTransactionStatus(this.SafeString(transaction, "status")) var feeCost interface{} = this.SafeNumber2(transaction, "depositFee", "withdrawFee") var typeVar interface{} = Ternary(IsTrue((InOp(transaction, "depositFee"))), "deposit", "withdrawal") var fee interface{} = nil if IsTrue(!IsEqual(feeCost, nil)) { fee = map[string]interface{} { "cost": feeCost, "currency": code, } } var toAddress interface{} = this.SafeString(transaction, "toAddress") return map[string]interface{} { "info": transaction, "id": this.SafeString2(transaction, "id", "withdrawId"), "txid": this.SafeString(transaction, "txID"), "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "network": this.NetworkIdToCode(this.SafeString(transaction, "chain")), "address": nil, "addressTo": toAddress, "addressFrom": nil, "tag": this.SafeString(transaction, "tag"), "tagTo": nil, "tagFrom": nil, "type": typeVar, "amount": this.SafeNumber(transaction, "amount"), "currency": code, "status": status, "updated": updated, "fee": fee, "internal": nil, "comment": nil, } } /** * @method * @name bybit#fetchLedger * @description fetch the history of changes, actions done by the user or operations that altered the balance of the user * @see https://bybit-exchange.github.io/docs/v5/account/transaction-log * @see https://bybit-exchange.github.io/docs/v5/account/contract-transaction-log * @param {string} [code] unified currency code, default is undefined * @param {int} [since] timestamp in ms of the earliest ledger entry, default is undefined * @param {int} [limit] max number of ledger entries to return, default is undefined * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @param {string} [params.subType] if inverse will use v5/account/contract-transaction-log * @returns {object} a [ledger structure]{@link https://docs.ccxt.com/#/?id=ledger} */ func (this *bybit) FetchLedger(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) code := GetArg(optionalArgs, 0, nil) _ = code since := GetArg(optionalArgs, 1, nil) _ = since limit := GetArg(optionalArgs, 2, nil) _ = limit params := GetArg(optionalArgs, 3, map[string]interface{} {}) _ = params retRes58968 := (<-this.LoadMarkets()) PanicOnError(retRes58968) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchLedger", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes590019 := (<-this.FetchPaginatedCallCursor("fetchLedger", code, since, limit, params, "nextPageCursor", "cursor", nil, 50)) PanicOnError(retRes590019) ch <- retRes590019 return nil } var request interface{} = map[string]interface{} {} enableUnified:= (<-this.IsUnifiedEnabled()) PanicOnError(enableUnified) var currency interface{} = nil var currencyKey interface{} = "coin" if IsTrue(GetValue(enableUnified, 1)) { currencyKey = "currency" if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } } else { if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "start_date", this.Yyyymmdd(since)) } } if IsTrue(!IsEqual(code, nil)) { currency = this.Currency(code) AddElementToObject(request, currencyKey, GetValue(currency, "id")) } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } var subType interface{} = nil subTypeparamsVariable := this.HandleSubTypeAndParams("fetchLedger", nil, params); subType = GetValue(subTypeparamsVariable,0); params = GetValue(subTypeparamsVariable,1) var response interface{} = nil if IsTrue(GetValue(enableUnified, 1)) { if IsTrue(IsEqual(subType, "inverse")) { response = (<-this.PrivateGetV5AccountContractTransactionLog(this.Extend(request, params))) PanicOnError(response) } else { response = (<-this.PrivateGetV5AccountTransactionLog(this.Extend(request, params))) PanicOnError(response) } } else { response = (<-this.PrivateGetV5AccountContractTransactionLog(this.Extend(request, params))) PanicOnError(response) } // // { // "ret_code": 0, // "ret_msg": "ok", // "ext_code": "", // "result": { // "data": [ // { // "id": 234467, // "user_id": 1, // "coin": "BTC", // "wallet_id": 27913, // "type": "Realized P&L", // "amount": "-0.00000006", // "tx_id": "", // "address": "BTCUSD", // "wallet_balance": "0.03000330", // "exec_time": "2019-12-09T00:00:25.000Z", // "cross_seq": 0 // } // ] // }, // "ext_info": null, // "time_now": "1577481867.115552", // "rate_limit_status": 119, // "rate_limit_reset_ms": 1577481867122, // "rate_limit": 120 // } // // v5 transaction log // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "nextPageCursor": "21963%3A1%2C14954%3A1", // "list": [ // { // "symbol": "XRPUSDT", // "side": "Buy", // "funding": "-0.003676", // "orderLinkId": "", // "orderId": "1672128000-8-592324-1-2", // "fee": "0.00000000", // "change": "-0.003676", // "cashFlow": "0", // "transactionTime": "1672128000000", // "type": "SETTLEMENT", // "feeRate": "0.0001", // "size": "100", // "qty": "100", // "cashBalance": "5086.55825002", // "currency": "USDT", // "category": "linear", // "tradePrice": "0.3676", // "tradeId": "534c0003-4bf7-486f-aa02-78cee36825e4" // }, // { // "symbol": "XRPUSDT", // "side": "Buy", // "funding": "", // "orderLinkId": "linear-order", // "orderId": "592b7e41-78fd-42e2-9aa3-91e1835ef3e1", // "fee": "0.01908720", // "change": "-0.0190872", // "cashFlow": "0", // "transactionTime": "1672121182224", // "type": "TRADE", // "feeRate": "0.0006", // "size": "100", // "qty": "88", // "cashBalance": "5086.56192602", // "currency": "USDT", // "category": "linear", // "tradePrice": "0.3615", // "tradeId": "5184f079-88ec-54c7-8774-5173cafd2b4e" // }, // { // "symbol": "XRPUSDT", // "side": "Buy", // "funding": "", // "orderLinkId": "linear-order", // "orderId": "592b7e41-78fd-42e2-9aa3-91e1835ef3e1", // "fee": "0.00260280", // "change": "-0.0026028", // "cashFlow": "0", // "transactionTime": "1672121182224", // "type": "TRADE", // "feeRate": "0.0006", // "size": "12", // "qty": "12", // "cashBalance": "5086.58101322", // "currency": "USDT", // "category": "linear", // "tradePrice": "0.3615", // "tradeId": "8569c10f-5061-5891-81c4-a54929847eb3" // } // ] // }, // "retExtInfo": {}, // "time": 1672132481405 // } // var data interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseLedger(data, currency, since, limit) return nil }() return ch } func (this *bybit) ParseLedgerEntry(item interface{}, optionalArgs ...interface{}) interface{} { // // { // "id": 234467, // "user_id": 1, // "coin": "BTC", // "wallet_id": 27913, // "type": "Realized P&L", // "amount": "-0.00000006", // "tx_id": "", // "address": "BTCUSD", // "wallet_balance": "0.03000330", // "exec_time": "2019-12-09T00:00:25.000Z", // "cross_seq": 0 // } // // { // "symbol": "XRPUSDT", // "side": "Buy", // "funding": "", // "orderLinkId": "linear-order", // "orderId": "592b7e41-78fd-42e2-9aa3-91e1835ef3e1", // "fee": "0.00260280", // "change": "-0.0026028", // "cashFlow": "0", // "transactionTime": "1672121182224", // "type": "TRADE", // "feeRate": "0.0006", // "size": "12", // "qty": "12", // "cashBalance": "5086.58101322", // "currency": "USDT", // "category": "linear", // "tradePrice": "0.3615", // "tradeId": "8569c10f-5061-5891-81c4-a54929847eb3" // } // currency := GetArg(optionalArgs, 0, nil) _ = currency var currencyId interface{} = this.SafeString2(item, "coin", "currency") var code interface{} = this.SafeCurrencyCode(currencyId, currency) currency = this.SafeCurrency(currencyId, currency) var amountString interface{} = this.SafeString2(item, "amount", "change") var afterString interface{} = this.SafeString2(item, "wallet_balance", "cashBalance") var direction interface{} = Ternary(IsTrue(Precise.StringLt(amountString, "0")), "out", "in") var before interface{} = nil var after interface{} = nil var amount interface{} = nil if IsTrue(IsTrue(!IsEqual(afterString, nil)) && IsTrue(!IsEqual(amountString, nil))) { var difference interface{} = Ternary(IsTrue((IsEqual(direction, "out"))), amountString, Precise.StringNeg(amountString)) before = this.ParseToNumeric(Precise.StringAdd(afterString, difference)) after = this.ParseToNumeric(afterString) amount = this.ParseToNumeric(Precise.StringAbs(amountString)) } var timestamp interface{} = this.Parse8601(this.SafeString(item, "exec_time")) if IsTrue(IsEqual(timestamp, nil)) { timestamp = this.SafeInteger(item, "transactionTime") } return this.SafeLedgerEntry(map[string]interface{} { "info": item, "id": this.SafeString(item, "id"), "direction": direction, "account": this.SafeString(item, "wallet_id"), "referenceId": this.SafeString(item, "tx_id"), "referenceAccount": nil, "type": this.ParseLedgerEntryType(this.SafeString(item, "type")), "currency": code, "amount": amount, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "before": before, "after": after, "status": "ok", "fee": map[string]interface{} { "currency": code, "cost": this.SafeNumber(item, "fee"), }, }, currency) } func (this *bybit) ParseLedgerEntryType(typeVar interface{}) interface{} { var types interface{} = map[string]interface{} { "Deposit": "transaction", "Withdraw": "transaction", "RealisedPNL": "trade", "Commission": "fee", "Refund": "cashback", "Prize": "prize", "ExchangeOrderWithdraw": "transaction", "ExchangeOrderDeposit": "transaction", "TRANSFER_IN": "transaction", "TRANSFER_OUT": "transaction", "TRADE": "trade", "SETTLEMENT": "trade", "DELIVERY": "trade", "LIQUIDATION": "trade", "BONUS": "Prize", "FEE_REFUND": "cashback", "INTEREST": "transaction", "CURRENCY_BUY": "trade", "CURRENCY_SELL": "trade", } return this.SafeString(types, typeVar, typeVar) } /** * @method * @name bybit#withdraw * @description make a withdrawal * @see https://bybit-exchange.github.io/docs/v5/asset/withdraw * @param {string} code unified currency code * @param {float} amount the amount to withdraw * @param {string} address the address to withdraw to * @param {string} tag * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a [transaction structure]{@link https://docs.ccxt.com/#/?id=transaction-structure} */ func (this *bybit) Withdraw(code interface{}, amount interface{}, address interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) tag := GetArg(optionalArgs, 0, nil) _ = tag params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params tagparamsVariable := this.HandleWithdrawTagAndParams(tag, params); tag = GetValue(tagparamsVariable,0); params = GetValue(tagparamsVariable,1) var accountType interface{} = nil accountTypeparamsVariable := this.HandleOptionAndParams(params, "withdraw", "accountType", "SPOT"); accountType = GetValue(accountTypeparamsVariable,0); params = GetValue(accountTypeparamsVariable,1) retRes61808 := (<-this.LoadMarkets()) PanicOnError(retRes61808) this.CheckAddress(address) var currency interface{} = this.Currency(code) var request interface{} = map[string]interface{} { "coin": GetValue(currency, "id"), "amount": this.NumberToString(amount), "address": address, "timestamp": this.Milliseconds(), "accountType": accountType, } if IsTrue(!IsEqual(tag, nil)) { AddElementToObject(request, "tag", tag) } networkCodequeryVariable := this.HandleNetworkCodeAndParams(params); networkCode := GetValue(networkCodequeryVariable,0); query := GetValue(networkCodequeryVariable,1) var networkId interface{} = this.NetworkCodeToId(networkCode) if IsTrue(!IsEqual(networkId, nil)) { AddElementToObject(request, "chain", ToUpper(networkId)) } response:= (<-this.PrivatePostV5AssetWithdrawCreate(this.Extend(request, query))) PanicOnError(response) // // { // "retCode": "0", // "retMsg": "success", // "result": { // "id": "9377266" // }, // "retExtInfo": {}, // "time": "1666892894902" // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) ch <- this.ParseTransaction(result, currency) return nil }() return ch } /** * @method * @name bybit#fetchPosition * @description fetch data on a single open contract trade position * @see https://bybit-exchange.github.io/docs/v5/position * @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 *bybit) 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 if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " fetchPosition() requires a symbol argument"))) } retRes62278 := (<-this.LoadMarkets()) PanicOnError(retRes62278) var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } var response interface{} = nil var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchPosition", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) AddElementToObject(request, "category", typeVar) response = (<-this.PrivateGetV5PositionList(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "nextPageCursor": "updateAt%3D1672279322668", // "category": "linear", // "list": [ // { // "symbol": "XRPUSDT", // "leverage": "10", // "avgPrice": "0.3615", // "liqPrice": "0.0001", // "riskLimitValue": "200000", // "takeProfit": "", // "positionValue": "36.15", // "tpslMode": "Full", // "riskId": 41, // "trailingStop": "0", // "unrealisedPnl": "-1.83", // "markPrice": "0.3432", // "cumRealisedPnl": "0.48805876", // "positionMM": "0.381021", // "createdTime": "1672121182216", // "positionIdx": 0, // "positionIM": "3.634521", // "updatedTime": "1672279322668", // "side": "Buy", // "bustPrice": "", // "size": "100", // "positionStatus": "Normal", // "stopLoss": "", // "tradeMode": 0 // } // ] // }, // "retExtInfo": {}, // "time": 1672280219169 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var positions interface{} = this.SafeList2(result, "list", "dataList", []interface{}{}) var timestamp interface{} = this.SafeInteger(response, "time") var first interface{} = this.SafeDict(positions, 0, map[string]interface{} {}) var position interface{} = this.ParsePosition(first, market) AddElementToObject(position, "timestamp", timestamp) AddElementToObject(position, "datetime", this.Iso8601(timestamp)) ch <- position return nil }() return ch } /** * @method * @name bybit#fetchPositions * @description fetch all open positions * @see https://bybit-exchange.github.io/docs/v5/position * @param {string[]} symbols list of unified market symbols * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {string} [params.baseCoin] Base coin. Supports linear, inverse & option * @param {string} [params.settleCoin] Settle coin. Supports linear, inverse & option * @returns {object[]} a list of [position structure]{@link https://docs.ccxt.com/#/?id=position-structure} */ func (this *bybit) 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 retRes63018 := (<-this.LoadMarkets()) PanicOnError(retRes63018) var symbol interface{} = nil if IsTrue(IsTrue((!IsEqual(symbols, nil))) && IsTrue(IsArray(symbols))) { var symbolsLength interface{} = GetArrayLength(symbols) if IsTrue(IsGreaterThan(symbolsLength, 1)) { panic(ArgumentsRequired(Add(this.Id, " fetchPositions() does not accept an array with more than one symbol"))) } else if IsTrue(IsEqual(symbolsLength, 1)) { symbol = GetValue(symbols, 0) } symbols = this.MarketSymbols(symbols) } else if IsTrue(!IsEqual(symbols, nil)) { symbol = symbols symbols = []interface{}{this.Symbol(symbol)} } var request interface{} = map[string]interface{} {} var market interface{} = nil if IsTrue(!IsEqual(symbol, nil)) { market = this.Market(symbol) symbol = GetValue(market, "symbol") AddElementToObject(request, "symbol", GetValue(market, "id")) } var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchPositions", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(IsTrue(IsEqual(typeVar, "linear")) || IsTrue(IsEqual(typeVar, "inverse"))) { var baseCoin interface{} = this.SafeString(params, "baseCoin") if IsTrue(IsEqual(typeVar, "linear")) { if IsTrue(IsTrue(IsEqual(symbol, nil)) && IsTrue(IsEqual(baseCoin, nil))) { var defaultSettle interface{} = this.SafeString(this.Options, "defaultSettle", "USDT") var settleCoin interface{} = this.SafeString(params, "settleCoin", defaultSettle) AddElementToObject(request, "settleCoin", settleCoin) } } else { // inverse if IsTrue(IsTrue(IsEqual(symbol, nil)) && IsTrue(IsEqual(baseCoin, nil))) { AddElementToObject(request, "category", "inverse") } } } params = this.Omit(params, []interface{}{"type"}) AddElementToObject(request, "category", typeVar) response:= (<-this.PrivateGetV5PositionList(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "Success", // "result": { // "nextPageCursor": "0%3A1657711949945%2C0%3A1657711949945", // "category": "linear", // "list": [ // { // "symbol": "ETHUSDT", // "leverage": "10", // "updatedTime": 1657711949945, // "side": "Buy", // "positionValue": "536.92500000", // "takeProfit": "", // "tpslMode": "Full", // "riskId": 11, // "trailingStop": "", // "entryPrice": "1073.85000000", // "unrealisedPnl": "", // "markPrice": "1080.65000000", // "size": "0.5000", // "positionStatus": "normal", // "stopLoss": "", // "cumRealisedPnl": "-0.32215500", // "positionMM": "2.97456450", // "createdTime": 1657711949928, // "positionIdx": 0, // "positionIM": "53.98243950" // } // ] // }, // "time": 1657713693182 // } // var positions interface{} = this.AddPaginationCursorToResult(response) var results interface{} = []interface{}{} for i := 0; IsLessThan(i, GetArrayLength(positions)); i++ { var rawPosition interface{} = GetValue(positions, i) if IsTrue(IsTrue((InOp(rawPosition, "data"))) && IsTrue((InOp(rawPosition, "is_valid")))) { // futures only rawPosition = this.SafeDict(rawPosition, "data") } AppendToArray(&results,this.ParsePosition(rawPosition)) } ch <- this.FilterByArrayPositions(results, "symbol", symbols, false) return nil }() return ch } func (this *bybit) ParsePosition(position interface{}, optionalArgs ...interface{}) interface{} { // // linear swap // // { // "positionIdx": 0, // "riskId": "11", // "symbol": "ETHUSDT", // "side": "Buy", // "size": "0.10", // "positionValue": "119.845", // "entryPrice": "1198.45", // "tradeMode": 1, // "autoAddMargin": 0, // "leverage": "4.2", // "positionBalance": "28.58931118", // "liqPrice": "919.10", // "bustPrice": "913.15", // "takeProfit": "0.00", // "stopLoss": "0.00", // "trailingStop": "0.00", // "unrealisedPnl": "0.083", // "createdTime": "1669097244192", // "updatedTime": "1669413126190", // "tpSlMode": "Full", // "riskLimitValue": "900000", // "activePrice": "0.00" // } // // usdc // { // "symbol":"BTCPERP", // "leverage":"1.00", // "occClosingFee":"0.0000", // "liqPrice":"", // "positionValue":"30.8100", // "takeProfit":"0.0", // "riskId":"10001", // "trailingStop":"0.0000", // "unrealisedPnl":"0.0000", // "createdAt":"1652451795305", // "markPrice":"30809.41", // "cumRealisedPnl":"0.0000", // "positionMM":"0.1541", // "positionIM":"30.8100", // "updatedAt":"1652451795305", // "tpSLMode":"UNKNOWN", // "side":"Buy", // "bustPrice":"", // "deleverageIndicator":"0", // "entryPrice":"30810.0", // "size":"0.001", // "sessionRPL":"0.0000", // "positionStatus":"NORMAL", // "sessionUPL":"-0.0006", // "stopLoss":"0.0", // "orderMargin":"0.0000", // "sessionAvgPrice":"30810.0" // } // // unified margin // // { // "symbol": "ETHUSDT", // "leverage": "10", // "updatedTime": 1657711949945, // "side": "Buy", // "positionValue": "536.92500000", // "takeProfit": "", // "tpslMode": "Full", // "riskId": 11, // "trailingStop": "", // "entryPrice": "1073.85000000", // "unrealisedPnl": "", // "markPrice": "1080.65000000", // "size": "0.5000", // "positionStatus": "normal", // "stopLoss": "", // "cumRealisedPnl": "-0.32215500", // "positionMM": "2.97456450", // "createdTime": 1657711949928, // "positionIdx": 0, // "positionIM": "53.98243950" // } // // unified account // // { // "symbol": "XRPUSDT", // "leverage": "10", // "avgPrice": "0.3615", // "liqPrice": "0.0001", // "riskLimitValue": "200000", // "takeProfit": "", // "positionValue": "36.15", // "tpslMode": "Full", // "riskId": 41, // "trailingStop": "0", // "unrealisedPnl": "-1.83", // "markPrice": "0.3432", // "cumRealisedPnl": "0.48805876", // "positionMM": "0.381021", // "createdTime": "1672121182216", // "positionIdx": 0, // "positionIM": "3.634521", // "updatedTime": "1672279322668", // "side": "Buy", // "bustPrice": "", // "size": "100", // "positionStatus": "Normal", // "stopLoss": "", // "tradeMode": 0 // } // // fetchPositionsHistory // // { // symbol: 'XRPUSDT', // orderType: 'Market', // leverage: '10', // updatedTime: '1712717265572', // side: 'Sell', // orderId: '071749f3-a9fa-427b-b5ca-27b2f52b81de', // closedPnl: '-0.00049568', // avgEntryPrice: '0.6045', // qty: '3', // cumEntryValue: '1.8135', // createdTime: '1712717265566', // orderPrice: '0.5744', // closedSize: '3', // avgExitPrice: '0.605', // execType: 'Trade', // fillCount: '1', // cumExitValue: '1.815' // } // market := GetArg(optionalArgs, 0, nil) _ = market var closedSize interface{} = this.SafeString(position, "closedSize") var isHistory interface{} = (!IsEqual(closedSize, nil)) var contract interface{} = this.SafeString(position, "symbol") market = this.SafeMarket(contract, market, nil, "contract") var size interface{} = Precise.StringAbs(this.SafeString2(position, "size", "qty")) var side interface{} = this.SafeString(position, "side") if IsTrue(!IsEqual(side, nil)) { if IsTrue(IsEqual(side, "Buy")) { side = Ternary(IsTrue(isHistory), "short", "long") } else if IsTrue(IsEqual(side, "Sell")) { side = Ternary(IsTrue(isHistory), "long", "short") } else { side = nil } } var notional interface{} = this.SafeString2(position, "positionValue", "cumExitValue") var unrealisedPnl interface{} = this.OmitZero(this.SafeString(position, "unrealisedPnl")) var initialMarginString interface{} = this.SafeStringN(position, []interface{}{"positionIM", "cumEntryValue"}) var maintenanceMarginString interface{} = this.SafeString(position, "positionMM") var timestamp interface{} = this.SafeIntegerN(position, []interface{}{"createdTime", "createdAt"}) var lastUpdateTimestamp interface{} = this.Parse8601(this.SafeString(position, "updated_at")) if IsTrue(IsEqual(lastUpdateTimestamp, nil)) { lastUpdateTimestamp = this.SafeIntegerN(position, []interface{}{"updatedTime", "updatedAt", "updatedTime"}) } var tradeMode interface{} = this.SafeInteger(position, "tradeMode", 0) var marginMode interface{} = nil if IsTrue(IsTrue((!IsTrue(GetValue(this.Options, "enableUnifiedAccount")))) || IsTrue((IsTrue(GetValue(this.Options, "enableUnifiedAccount")) && IsTrue(GetValue(market, "inverse"))))) { // tradeMode would work for classic and UTA(inverse) if !IsTrue(isHistory) { marginMode = Ternary(IsTrue((IsEqual(tradeMode, 1))), "isolated", "cross") } } var collateralString interface{} = this.SafeString(position, "positionBalance") var entryPrice interface{} = this.OmitZero(this.SafeStringN(position, []interface{}{"entryPrice", "avgPrice", "avgEntryPrice"})) var liquidationPrice interface{} = this.OmitZero(this.SafeString(position, "liqPrice")) var leverage interface{} = this.SafeString(position, "leverage") if IsTrue(!IsEqual(liquidationPrice, nil)) { if IsTrue(IsEqual(GetValue(market, "settle"), "USDC")) { // (Entry price - Liq price) * Contracts + Maintenance Margin + (unrealised pnl) = Collateral var difference interface{} = Precise.StringAbs(Precise.StringSub(entryPrice, liquidationPrice)) collateralString = Precise.StringAdd(Precise.StringAdd(Precise.StringMul(difference, size), maintenanceMarginString), unrealisedPnl) } else { var bustPrice interface{} = this.SafeString(position, "bustPrice") if IsTrue(GetValue(market, "linear")) { // derived from the following formulas // (Entry price - Bust price) * Contracts = Collateral // (Entry price - Liq price) * Contracts = Collateral - Maintenance Margin // Maintenance Margin = (Bust price - Liq price) x Contracts var maintenanceMarginPriceDifference interface{} = Precise.StringAbs(Precise.StringSub(liquidationPrice, bustPrice)) maintenanceMarginString = Precise.StringMul(maintenanceMarginPriceDifference, size) // Initial Margin = Contracts x Entry Price / Leverage if IsTrue(!IsEqual(entryPrice, nil)) { initialMarginString = Precise.StringDiv(Precise.StringMul(size, entryPrice), leverage) } } else { // Contracts * (1 / Entry price - 1 / Bust price) = Collateral // Contracts * (1 / Entry price - 1 / Liq price) = Collateral - Maintenance Margin // Maintenance Margin = Contracts * (1 / Liq price - 1 / Bust price) // Maintenance Margin = Contracts * (Bust price - Liq price) / (Liq price x Bust price) var difference interface{} = Precise.StringAbs(Precise.StringSub(bustPrice, liquidationPrice)) var multiply interface{} = Precise.StringMul(bustPrice, liquidationPrice) maintenanceMarginString = Precise.StringDiv(Precise.StringMul(size, difference), multiply) // Initial Margin = Leverage x Contracts / EntryPrice if IsTrue(!IsEqual(entryPrice, nil)) { initialMarginString = Precise.StringDiv(size, Precise.StringMul(entryPrice, leverage)) } } } } var maintenanceMarginPercentage interface{} = Precise.StringDiv(maintenanceMarginString, notional) var marginRatio interface{} = Precise.StringDiv(maintenanceMarginString, collateralString, 4) var positionIdx interface{} = this.SafeString(position, "positionIdx") var hedged interface{} = IsTrue((!IsEqual(positionIdx, nil))) && IsTrue((!IsEqual(positionIdx, "0"))) return this.SafePosition(map[string]interface{} { "info": position, "id": nil, "symbol": GetValue(market, "symbol"), "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "lastUpdateTimestamp": lastUpdateTimestamp, "initialMargin": this.ParseNumber(initialMarginString), "initialMarginPercentage": this.ParseNumber(Precise.StringDiv(initialMarginString, notional)), "maintenanceMargin": this.ParseNumber(maintenanceMarginString), "maintenanceMarginPercentage": this.ParseNumber(maintenanceMarginPercentage), "entryPrice": this.ParseNumber(entryPrice), "notional": this.ParseNumber(notional), "leverage": this.ParseNumber(leverage), "unrealizedPnl": this.ParseNumber(unrealisedPnl), "realizedPnl": this.SafeNumber(position, "closedPnl"), "contracts": this.ParseNumber(size), "contractSize": this.SafeNumber(market, "contractSize"), "marginRatio": this.ParseNumber(marginRatio), "liquidationPrice": this.ParseNumber(liquidationPrice), "markPrice": this.SafeNumber(position, "markPrice"), "lastPrice": this.SafeNumber(position, "avgExitPrice"), "collateral": this.ParseNumber(collateralString), "marginMode": marginMode, "side": side, "percentage": nil, "stopLossPrice": this.SafeNumber2(position, "stop_loss", "stopLoss"), "takeProfitPrice": this.SafeNumber2(position, "take_profit", "takeProfit"), "hedged": hedged, }) } /** * @method * @name bybit#fetchLeverage * @description fetch the set leverage for a market * @see https://bybit-exchange.github.io/docs/v5/position * @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 *bybit) 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 retRes66418 := (<-this.LoadMarkets()) PanicOnError(retRes66418) var market interface{} = this.Market(symbol) position:= (<-this.FetchPosition(symbol, params)) PanicOnError(position) ch <- this.ParseLeverage(position, market) return nil }() return ch } func (this *bybit) ParseLeverage(leverage interface{}, optionalArgs ...interface{}) interface{} { market := GetArg(optionalArgs, 0, nil) _ = market var marketId interface{} = this.SafeString(leverage, "symbol") var leverageValue interface{} = this.SafeInteger(leverage, "leverage") return map[string]interface{} { "info": leverage, "symbol": this.SafeSymbol(marketId, market), "marginMode": this.SafeStringLower(leverage, "marginMode"), "longLeverage": leverageValue, "shortLeverage": leverageValue, } } /** * @method * @name bybit#setMarginMode * @description set margin mode (account) or trade mode (symbol) * @see https://bybit-exchange.github.io/docs/v5/account/set-margin-mode * @see https://bybit-exchange.github.io/docs/v5/position/cross-isolate * @param {string} marginMode account mode must be either [isolated, cross, portfolio], trade mode must be either [isolated, cross] * @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 * @param {string} [params.leverage] the rate of leverage, is required if setting trade mode (symbol) * @returns {object} response from the exchange */ func (this *bybit) 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 retRes66728 := (<-this.LoadMarkets()) PanicOnError(retRes66728) enableUnifiedMarginenableUnifiedAccountVariable := (<-this.IsUnifiedEnabled()); enableUnifiedMargin := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,0); enableUnifiedAccount := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,1) var isUnifiedAccount interface{} = (IsTrue(enableUnifiedMargin) || IsTrue(enableUnifiedAccount)) var market interface{} = nil var response interface{} = nil if IsTrue(isUnifiedAccount) { if IsTrue(IsEqual(marginMode, "isolated")) { marginMode = "ISOLATED_MARGIN" } else if IsTrue(IsEqual(marginMode, "cross")) { marginMode = "REGULAR_MARGIN" } else if IsTrue(IsEqual(marginMode, "portfolio")) { marginMode = "PORTFOLIO_MARGIN" } else { panic(NotSupported(Add(this.Id, " setMarginMode() marginMode must be either [isolated, cross, portfolio]"))) } var request interface{} = map[string]interface{} { "setMarginMode": marginMode, } response = (<-this.PrivatePostV5AccountSetMarginMode(this.Extend(request, params))) PanicOnError(response) } else { if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " setMarginMode() requires a symbol parameter for non unified account"))) } market = this.Market(symbol) var isUsdcSettled interface{} = IsEqual(GetValue(market, "settle"), "USDC") if IsTrue(isUsdcSettled) { if IsTrue(IsEqual(marginMode, "cross")) { marginMode = "REGULAR_MARGIN" } else if IsTrue(IsEqual(marginMode, "portfolio")) { marginMode = "PORTFOLIO_MARGIN" } else { panic(NotSupported(Add(this.Id, " setMarginMode() for usdc market marginMode must be either [cross, portfolio]"))) } var request interface{} = map[string]interface{} { "setMarginMode": marginMode, } response = (<-this.PrivatePostV5AccountSetMarginMode(this.Extend(request, params))) PanicOnError(response) } else { var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("setPositionMode", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) var tradeMode interface{} = nil if IsTrue(IsEqual(marginMode, "cross")) { tradeMode = 0 } else if IsTrue(IsEqual(marginMode, "isolated")) { tradeMode = 1 } else { panic(NotSupported(Add(this.Id, " setMarginMode() with symbol marginMode must be either [isolated, cross]"))) } var sellLeverage interface{} = nil var buyLeverage interface{} = nil var leverage interface{} = this.SafeString(params, "leverage") if IsTrue(IsEqual(leverage, nil)) { sellLeverage = this.SafeString2(params, "sell_leverage", "sellLeverage") buyLeverage = this.SafeString2(params, "buy_leverage", "buyLeverage") if IsTrue(IsTrue(IsEqual(sellLeverage, nil)) && IsTrue(IsEqual(buyLeverage, nil))) { panic(ArgumentsRequired(Add(this.Id, " setMarginMode() requires a leverage parameter or sell_leverage and buy_leverage parameters"))) } if IsTrue(IsEqual(buyLeverage, nil)) { buyLeverage = sellLeverage } if IsTrue(IsEqual(sellLeverage, nil)) { sellLeverage = buyLeverage } params = this.Omit(params, []interface{}{"buy_leverage", "sell_leverage", "sellLeverage", "buyLeverage"}) } else { sellLeverage = leverage buyLeverage = leverage params = this.Omit(params, "leverage") } var request interface{} = map[string]interface{} { "category": typeVar, "symbol": GetValue(market, "id"), "tradeMode": tradeMode, "buyLeverage": buyLeverage, "sellLeverage": sellLeverage, } response = (<-this.PrivatePostV5PositionSwitchIsolated(this.Extend(request, params))) PanicOnError(response) } } ch <- response return nil }() return ch } /** * @method * @name bybit#setLeverage * @description set the level of leverage for a market * @see https://bybit-exchange.github.io/docs/v5/position/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 * @param {string} [params.buyLeverage] leverage for buy side * @param {string} [params.sellLeverage] leverage for sell side * @returns {object} response from the exchange */ func (this *bybit) SetLeverage(leverage interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbol := GetArg(optionalArgs, 0, nil) _ = symbol params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params if IsTrue(IsEqual(symbol, nil)) { panic(ArgumentsRequired(Add(this.Id, " setLeverage() requires a symbol argument"))) } retRes67708 := (<-this.LoadMarkets()) PanicOnError(retRes67708) var market interface{} = this.Market(symbol) // WARNING: THIS WILL INCREASE LIQUIDATION PRICE FOR OPEN ISOLATED LONG POSITIONS // AND DECREASE LIQUIDATION PRICE FOR OPEN ISOLATED SHORT POSITIONS // engage in leverage setting // we reuse the code here instead of having two methods var leverageString interface{} = this.NumberToString(leverage) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), "buyLeverage": leverageString, "sellLeverage": leverageString, } AddElementToObject(request, "buyLeverage", leverageString) AddElementToObject(request, "sellLeverage", leverageString) if IsTrue(GetValue(market, "linear")) { AddElementToObject(request, "category", "linear") } else if IsTrue(GetValue(market, "inverse")) { AddElementToObject(request, "category", "inverse") } else { panic(NotSupported(Add(this.Id, " setLeverage() only support linear and inverse market"))) } response:= (<-this.PrivatePostV5PositionSetLeverage(this.Extend(request, params))) PanicOnError(response) ch <- response return nil }() return ch } /** * @method * @name bybit#setPositionMode * @description set hedged to true or false for a market * @see https://bybit-exchange.github.io/docs/v5/position/position-mode * @param {bool} hedged * @param {string} symbol used for unified account with inverse market * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} response from the exchange */ func (this *bybit) 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 retRes68068 := (<-this.LoadMarkets()) PanicOnError(retRes68068) var market interface{} = nil if IsTrue(!IsEqual(symbol, nil)) { market = this.Market(symbol) } var mode interface{} = nil if IsTrue(hedged) { mode = 3 } else { mode = 0 } var request interface{} = map[string]interface{} { "mode": mode, } if IsTrue(IsEqual(symbol, nil)) { AddElementToObject(request, "coin", "USDT") } else { AddElementToObject(request, "symbol", GetValue(market, "id")) } if IsTrue(!IsEqual(symbol, nil)) { AddElementToObject(request, "category", Ternary(IsTrue(GetValue(market, "linear")), "linear", "inverse")) } else { var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("setPositionMode", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) AddElementToObject(request, "category", typeVar) } params = this.Omit(params, "type") response:= (<-this.PrivatePostV5PositionSwitchMode(this.Extend(request, params))) PanicOnError(response) // // v5 // { // "retCode": 0, // "retMsg": "OK", // "result": {}, // "retExtInfo": {}, // "time": 1675249072814 // } ch <- response return nil }() return ch } func (this *bybit) FetchDerivativesOpenInterestHistory(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) timeframe := GetArg(optionalArgs, 0, "1h") _ = timeframe since := GetArg(optionalArgs, 1, nil) _ = since limit := GetArg(optionalArgs, 2, nil) _ = limit params := GetArg(optionalArgs, 3, map[string]interface{} {}) _ = params retRes68478 := (<-this.LoadMarkets()) PanicOnError(retRes68478) var market interface{} = this.Market(symbol) var subType interface{} = Ternary(IsTrue(GetValue(market, "linear")), "linear", "inverse") var category interface{} = this.SafeString(params, "category", subType) var intervals interface{} = this.SafeDict(this.Options, "intervals") var interval interface{} = this.SafeString(intervals, timeframe) // 5min,15min,30min,1h,4h,1d if IsTrue(IsEqual(interval, nil)) { panic(BadRequest(Add(Add(Add(this.Id, " fetchOpenInterestHistory() cannot use the "), timeframe), " timeframe"))) } var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), "intervalTime": interval, "category": category, } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } var until interface{} = this.SafeInteger(params, "until") // unified in milliseconds params = this.Omit(params, []interface{}{"until"}) if IsTrue(!IsEqual(until, nil)) { AddElementToObject(request, "endTime", until) } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } response:= (<-this.PublicGetV5MarketOpenInterest(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "symbol": "BTCUSD", // "category": "inverse", // "list": [ // { // "openInterest": "461134384.00000000", // "timestamp": "1669571400000" // }, // { // "openInterest": "461134292.00000000", // "timestamp": "1669571100000" // } // ], // "nextPageCursor": "" // }, // "retExtInfo": {}, // "time": 1672053548579 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var data interface{} = this.AddPaginationCursorToResult(response) var id interface{} = this.SafeString(result, "symbol") market = this.SafeMarket(id, market, nil, "contract") ch <- this.ParseOpenInterestsHistory(data, market, since, limit) return nil }() return ch } /** * @method * @name bybit#fetchOpenInterest * @description Retrieves the open interest of a derivative trading pair * @see https://bybit-exchange.github.io/docs/v5/market/open-interest * @param {string} symbol Unified CCXT market symbol * @param {object} [params] exchange specific parameters * @param {string} [params.interval] 5m, 15m, 30m, 1h, 4h, 1d * @param {string} [params.category] "linear" or "inverse" * @returns {object} an open interest structure{@link https://docs.ccxt.com/#/?id=open-interest-structure} */ func (this *bybit) FetchOpenInterest(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes69158 := (<-this.LoadMarkets()) PanicOnError(retRes69158) var market interface{} = this.Market(symbol) if !IsTrue(GetValue(market, "contract")) { panic(BadRequest(Add(this.Id, " fetchOpenInterest() supports contract markets only"))) } var timeframe interface{} = this.SafeString(params, "interval", "1h") var intervals interface{} = this.SafeDict(this.Options, "intervals") var interval interface{} = this.SafeString(intervals, timeframe) // 5min,15min,30min,1h,4h,1d if IsTrue(IsEqual(interval, nil)) { panic(BadRequest(Add(Add(Add(this.Id, " fetchOpenInterest() cannot use the "), timeframe), " timeframe"))) } var subType interface{} = Ternary(IsTrue(GetValue(market, "linear")), "linear", "inverse") var category interface{} = this.SafeString(params, "category", subType) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), "intervalTime": interval, "category": category, } response:= (<-this.PublicGetV5MarketOpenInterest(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "symbol": "BTCUSD", // "category": "inverse", // "list": [ // { // "openInterest": "461134384.00000000", // "timestamp": "1669571400000" // }, // { // "openInterest": "461134292.00000000", // "timestamp": "1669571100000" // } // ], // "nextPageCursor": "" // }, // "retExtInfo": {}, // "time": 1672053548579 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var id interface{} = this.SafeString(result, "symbol") market = this.SafeMarket(id, market, nil, "contract") var data interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseOpenInterest(GetValue(data, 0), market) return nil }() return ch } /** * @method * @name bybit#fetchOpenInterestHistory * @description Gets the total amount of unsettled contracts. In other words, the total number of contracts held in open positions * @see https://bybit-exchange.github.io/docs/v5/market/open-interest * @param {string} symbol Unified market symbol * @param {string} timeframe "5m", 15m, 30m, 1h, 4h, 1d * @param {int} [since] Not used by Bybit * @param {int} [limit] The number of open interest structures to return. Max 200, default 50 * @param {object} [params] Exchange specific parameters * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns An array of open interest structures */ func (this *bybit) FetchOpenInterestHistory(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) timeframe := GetArg(optionalArgs, 0, "1h") _ = timeframe since := GetArg(optionalArgs, 1, nil) _ = since limit := GetArg(optionalArgs, 2, nil) _ = limit params := GetArg(optionalArgs, 3, map[string]interface{} {}) _ = params if IsTrue(IsEqual(timeframe, "1m")) { panic(BadRequest(Add(this.Id, " fetchOpenInterestHistory cannot use the 1m timeframe"))) } retRes69818 := (<-this.LoadMarkets()) PanicOnError(retRes69818) var paginate interface{} = this.SafeBool(params, "paginate") if IsTrue(paginate) { params = this.Omit(params, "paginate") AddElementToObject(params, "timeframe", timeframe) retRes698619 := (<-this.FetchPaginatedCallCursor("fetchOpenInterestHistory", symbol, since, limit, params, "nextPageCursor", "cursor", nil, 200)) PanicOnError(retRes698619) ch <- retRes698619 return nil } var market interface{} = this.Market(symbol) if IsTrue(IsTrue(GetValue(market, "spot")) || IsTrue(GetValue(market, "option"))) { panic(BadRequest(Add(Add(this.Id, " fetchOpenInterestHistory() symbol does not support market "), symbol))) } var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } retRes699815 := (<-this.FetchDerivativesOpenInterestHistory(symbol, timeframe, since, limit, params)) PanicOnError(retRes699815) ch <- retRes699815 return nil }() return ch } func (this *bybit) ParseOpenInterest(interest interface{}, optionalArgs ...interface{}) interface{} { // // { // "openInterest": 64757.62400000, // "timestamp": 1665784800000, // } // market := GetArg(optionalArgs, 0, nil) _ = market var timestamp interface{} = this.SafeInteger(interest, "timestamp") var openInterest interface{} = this.SafeNumber2(interest, "open_interest", "openInterest") // the openInterest is in the base asset for linear and quote asset for inverse var amount interface{} = Ternary(IsTrue(GetValue(market, "linear")), openInterest, nil) var value interface{} = Ternary(IsTrue(GetValue(market, "inverse")), openInterest, nil) return this.SafeOpenInterest(map[string]interface{} { "symbol": GetValue(market, "symbol"), "openInterestAmount": amount, "openInterestValue": value, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "info": interest, }, market) } /** * @method * @name bybit#fetchCrossBorrowRate * @description fetch the rate of interest to borrow a currency for margin trading * @see https://bybit-exchange.github.io/docs/zh-TW/v5/spot-margin-normal/interest-quota * @param {string} code unified currency code * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a [borrow rate structure]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure} */ func (this *bybit) FetchCrossBorrowRate(code interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes70338 := (<-this.LoadMarkets()) PanicOnError(retRes70338) var currency interface{} = this.Currency(code) var request interface{} = map[string]interface{} { "coin": GetValue(currency, "id"), } response:= (<-this.PrivateGetV5SpotCrossMarginTradeLoanInfo(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": "0", // "retMsg": "success", // "result": { // "coin": "USDT", // "interestRate": "0.000107000000", // "loanAbleAmount": "", // "maxLoanAmount": "79999.999" // }, // "retExtInfo": null, // "time": "1666734490778" // } // var timestamp interface{} = this.SafeInteger(response, "time") var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) AddElementToObject(data, "timestamp", timestamp) ch <- this.ParseBorrowRate(data, currency) return nil }() return ch } func (this *bybit) ParseBorrowRate(info interface{}, optionalArgs ...interface{}) interface{} { // // { // "coin": "USDT", // "interestRate": "0.000107000000", // "loanAbleAmount": "", // "maxLoanAmount": "79999.999", // "timestamp": 1666734490778 // } // // fetchBorrowRateHistory // { // "timestamp": 1721469600000, // "currency": "USDC", // "hourlyBorrowRate": "0.000014621596", // "vipLevel": "No VIP" // } // currency := GetArg(optionalArgs, 0, nil) _ = currency var timestamp interface{} = this.SafeInteger(info, "timestamp") var currencyId interface{} = this.SafeString2(info, "coin", "currency") var hourlyBorrowRate interface{} = this.SafeNumber(info, "hourlyBorrowRate") var period interface{} = Ternary(IsTrue((!IsEqual(hourlyBorrowRate, nil))), 3600000, 86400000) // 1h or 1d return map[string]interface{} { "currency": this.SafeCurrencyCode(currencyId, currency), "rate": this.SafeNumber(info, "interestRate", hourlyBorrowRate), "period": period, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "info": info, } } /** * @method * @name bybit#fetchBorrowInterest * @description fetch the interest owed by the user for borrowing currency for margin trading * @see https://bybit-exchange.github.io/docs/zh-TW/v5/spot-margin-normal/account-info * @param {string} code unified currency code * @param {string} symbol unified market symbol when fetch interest in isolated markets * @param {number} [since] the earliest time in ms to fetch borrrow interest for * @param {number} [limit] the maximum number of structures to retrieve * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object[]} a list of [borrow interest structures]{@link https://docs.ccxt.com/#/?id=borrow-interest-structure} */ func (this *bybit) FetchBorrowInterest(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) code := GetArg(optionalArgs, 0, nil) _ = code symbol := GetArg(optionalArgs, 1, nil) _ = symbol since := GetArg(optionalArgs, 2, nil) _ = since limit := GetArg(optionalArgs, 3, nil) _ = limit params := GetArg(optionalArgs, 4, map[string]interface{} {}) _ = params retRes71048 := (<-this.LoadMarkets()) PanicOnError(retRes71048) var request interface{} = map[string]interface{} {} response:= (<-this.PrivateGetV5SpotCrossMarginTradeAccount(this.Extend(request, params))) PanicOnError(response) // // { // "ret_code": 0, // "ret_msg": "", // "ext_code": null, // "ext_info": null, // "result": { // "status": "1", // "riskRate": "0", // "acctBalanceSum": "0.000486213817680857", // "debtBalanceSum": "0", // "loanAccountList": [ // { // "tokenId": "BTC", // "total": "0.00048621", // "locked": "0", // "loan": "0", // "interest": "0", // "free": "0.00048621" // }, // ... // ] // } // } // var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var rows interface{} = this.SafeList(data, "loanAccountList", []interface{}{}) var interest interface{} = this.ParseBorrowInterests(rows, nil) ch <- this.FilterByCurrencySinceLimit(interest, code, since, limit) return nil }() return ch } /** * @method * @name bybit#fetchBorrowRateHistory * @description retrieves a history of a currencies borrow interest rate at specific time slots * @see https://bybit-exchange.github.io/docs/v5/spot-margin-uta/historical-interest * @param {string} code unified currency code * @param {int} [since] timestamp for the earliest borrow rate * @param {int} [limit] the maximum number of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure} to retrieve * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {int} [params.until] the latest time in ms to fetch entries for * @returns {object[]} an array of [borrow rate structures]{@link https://docs.ccxt.com/#/?id=borrow-rate-structure} */ func (this *bybit) FetchBorrowRateHistory(code 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 retRes71518 := (<-this.LoadMarkets()) PanicOnError(retRes71518) var currency interface{} = this.Currency(code) var request interface{} = map[string]interface{} { "currency": GetValue(currency, "id"), } if IsTrue(IsEqual(since, nil)) { since = Subtract(this.Milliseconds(), Multiply(86400000, 30)) // last 30 days } AddElementToObject(request, "startTime", since) var endTime interface{} = this.SafeInteger2(params, "until", "endTime") params = this.Omit(params, []interface{}{"until"}) if IsTrue(IsEqual(endTime, nil)) { endTime = Add(since, Multiply(86400000, 30)) // since + 30 days } AddElementToObject(request, "endTime", endTime) response:= (<-this.PrivateGetV5SpotMarginTradeInterestRateHistory(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "list": [ // { // "timestamp": 1721469600000, // "currency": "USDC", // "hourlyBorrowRate": "0.000014621596", // "vipLevel": "No VIP" // } // ] // }, // "retExtInfo": "{}", // "time": 1721899048991 // } // var data interface{} = this.SafeDict(response, "result") var rows interface{} = this.SafeList(data, "list", []interface{}{}) ch <- this.ParseBorrowRateHistory(rows, code, since, limit) return nil }() return ch } func (this *bybit) ParseBorrowInterest(info interface{}, optionalArgs ...interface{}) interface{} { // // { // "tokenId": "BTC", // "total": "0.00048621", // "locked": "0", // "loan": "0", // "interest": "0", // "free": "0.00048621" // }, // market := GetArg(optionalArgs, 0, nil) _ = market return map[string]interface{} { "info": info, "symbol": nil, "currency": this.SafeCurrencyCode(this.SafeString(info, "tokenId")), "interest": this.SafeNumber(info, "interest"), "interestRate": nil, "amountBorrowed": this.SafeNumber(info, "loan"), "marginMode": "cross", "timestamp": nil, "datetime": nil, } } /** * @method * @name bybit#transfer * @description transfer currency internally between wallets on the same account * @see https://bybit-exchange.github.io/docs/v5/asset/create-inter-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.transferId] UUID, which is unique across the platform * @returns {object} a [transfer structure]{@link https://docs.ccxt.com/#/?id=transfer-structure} */ func (this *bybit) 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 retRes72288 := (<-this.LoadMarkets()) PanicOnError(retRes72288) var transferId interface{} = this.SafeString(params, "transferId", this.Uuid()) var accountTypes interface{} = this.SafeDict(this.Options, "accountsByType", map[string]interface{} {}) var fromId interface{} = this.SafeString(accountTypes, fromAccount, fromAccount) var toId interface{} = this.SafeString(accountTypes, toAccount, toAccount) var currency interface{} = this.Currency(code) var amountToPrecision interface{} = this.CurrencyToPrecision(code, amount) var request interface{} = map[string]interface{} { "transferId": transferId, "fromAccountType": fromId, "toAccountType": toId, "coin": GetValue(currency, "id"), "amount": amountToPrecision, } response:= (<-this.PrivatePostV5AssetTransferInterTransfer(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "transferId": "4244af44-f3b0-4cf6-a743-b56560e987bc" // }, // "retExtInfo": {}, // "time": 1666875857205 // } // var timestamp interface{} = this.SafeInteger(response, "time") var transfer interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var statusRaw interface{} = this.SafeStringN(response, []interface{}{"retCode", "retMsg"}) var status interface{} = this.ParseTransferStatus(statusRaw) ch <- this.Extend(this.ParseTransfer(transfer, currency), map[string]interface{} { "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "amount": this.ParseNumber(amountToPrecision), "fromAccount": fromAccount, "toAccount": toAccount, "status": status, }) return nil }() return ch } /** * @method * @name bybit#fetchTransfers * @description fetch a history of internal transfers made on an account * @see https://bybit-exchange.github.io/docs/v5/asset/inter-transfer-list * @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 transfer structures to retrieve * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {int} [params.until] the latest time in ms to fetch entries for * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {object[]} a list of [transfer structures]{@link https://docs.ccxt.com/#/?id=transfer-structure} */ func (this *bybit) 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 retRes72828 := (<-this.LoadMarkets()) PanicOnError(retRes72828) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchTransfers", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes728619 := (<-this.FetchPaginatedCallCursor("fetchTransfers", code, since, limit, params, "nextPageCursor", "cursor", nil, 50)) PanicOnError(retRes728619) ch <- retRes728619 return nil } var currency interface{} = nil var request interface{} = map[string]interface{} {} if IsTrue(!IsEqual(code, nil)) { currency = this.SafeCurrency(code) AddElementToObject(request, "coin", GetValue(currency, "id")) } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } requestparamsVariable := this.HandleUntilOption("endTime", request, params); request = GetValue(requestparamsVariable,0); params = GetValue(requestparamsVariable,1) response:= (<-this.PrivateGetV5AssetTransferQueryInterTransferList(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "list": [ // { // "transferId": "selfTransfer_a1091cc7-9364-4b74-8de1-18f02c6f2d5c", // "coin": "USDT", // "amount": "5000", // "fromAccountType": "SPOT", // "toAccountType": "UNIFIED", // "timestamp": "1667283263000", // "status": "SUCCESS" // } // ], // "nextPageCursor": "eyJtaW5JRCI6MTM1ODQ2OCwibWF4SUQiOjEzNTg0Njh9" // }, // "retExtInfo": {}, // "time": 1670988271677 // } // var data interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseTransfers(data, currency, since, limit) return nil }() return ch } /** * @method * @name bybit#borrowCrossMargin * @description create a loan to borrow margin * @see https://bybit-exchange.github.io/docs/v5/spot-margin-normal/borrow * @param {string} code unified currency code of the currency to borrow * @param {float} amount the amount to borrow * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure} */ func (this *bybit) BorrowCrossMargin(code interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes73398 := (<-this.LoadMarkets()) PanicOnError(retRes73398) var currency interface{} = this.Currency(code) var request interface{} = map[string]interface{} { "coin": GetValue(currency, "id"), "qty": this.CurrencyToPrecision(code, amount), } response:= (<-this.PrivatePostV5SpotCrossMarginTradeLoan(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "transactId": "14143" // }, // "retExtInfo": null, // "time": 1662617848970 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var transaction interface{} = this.ParseMarginLoan(result, currency) ch <- this.Extend(transaction, map[string]interface{} { "symbol": nil, "amount": amount, }) return nil }() return ch } /** * @method * @name bybit#repayCrossMargin * @description repay borrowed margin and interest * @see https://bybit-exchange.github.io/docs/v5/spot-margin-normal/repay * @param {string} code unified currency code of the currency to repay * @param {float} amount the amount to repay * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a [margin loan structure]{@link https://docs.ccxt.com/#/?id=margin-loan-structure} */ func (this *bybit) RepayCrossMargin(code interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes73768 := (<-this.LoadMarkets()) PanicOnError(retRes73768) var currency interface{} = this.Currency(code) var request interface{} = map[string]interface{} { "coin": GetValue(currency, "id"), "qty": this.NumberToString(amount), } response:= (<-this.PrivatePostV5SpotCrossMarginTradeRepay(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "repayId": "12128" // }, // "retExtInfo": null, // "time": 1662618298452 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var transaction interface{} = this.ParseMarginLoan(result, currency) ch <- this.Extend(transaction, map[string]interface{} { "symbol": nil, "amount": amount, }) return nil }() return ch } func (this *bybit) ParseMarginLoan(info interface{}, optionalArgs ...interface{}) interface{} { // // borrowCrossMargin // // { // "transactId": "14143" // } // // repayCrossMargin // // { // "repayId": "12128" // } // currency := GetArg(optionalArgs, 0, nil) _ = currency return map[string]interface{} { "id": this.SafeString2(info, "transactId", "repayId"), "currency": this.SafeString(currency, "code"), "amount": nil, "symbol": nil, "timestamp": nil, "datetime": nil, "info": info, } } func (this *bybit) ParseTransferStatus(status interface{}) interface{} { var statuses interface{} = map[string]interface{} { "0": "ok", "OK": "ok", "SUCCESS": "ok", } return this.SafeString(statuses, status, status) } func (this *bybit) ParseTransfer(transfer interface{}, optionalArgs ...interface{}) interface{} { // // transfer // // { // "transferId": "22c2bc11-ed5b-49a4-8647-c4e0f5f6f2b2" // } // // fetchTransfers // // { // "transferId": "e9c421c4-b010-4b16-abd6-106179f27702", // "coin": "USDT", // "amount": "8", // "fromAccountType": "FUND", // "toAccountType": "SPOT", // "timestamp": "1666879426000", // "status": "SUCCESS" // } // currency := GetArg(optionalArgs, 0, nil) _ = currency var currencyId interface{} = this.SafeString(transfer, "coin") var timestamp interface{} = this.SafeInteger(transfer, "timestamp") var fromAccountId interface{} = this.SafeString(transfer, "fromAccountType") var toAccountId interface{} = this.SafeString(transfer, "toAccountType") var accountIds interface{} = this.SafeDict(this.Options, "accountsById", map[string]interface{} {}) var fromAccount interface{} = this.SafeString(accountIds, fromAccountId, fromAccountId) var toAccount interface{} = this.SafeString(accountIds, toAccountId, toAccountId) return map[string]interface{} { "info": transfer, "id": this.SafeString(transfer, "transferId"), "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "currency": this.SafeCurrencyCode(currencyId, currency), "amount": this.SafeNumber(transfer, "amount"), "fromAccount": fromAccount, "toAccount": toAccount, "status": this.ParseTransferStatus(this.SafeString(transfer, "status")), } } func (this *bybit) FetchDerivativesMarketLeverageTiers(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 retRes74778 := (<-this.LoadMarkets()) PanicOnError(retRes74778) var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } if IsTrue(GetValue(market, "linear")) { AddElementToObject(request, "category", "linear") } else if IsTrue(GetValue(market, "inverse")) { AddElementToObject(request, "category", "inverse") } response:= (<-this.PublicGetV5MarketRiskLimit(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "category": "inverse", // "list": [ // { // "id": 1, // "symbol": "BTCUSD", // "riskLimitValue": "150", // "maintenanceMargin": "0.5", // "initialMargin": "1", // "isLowestRisk": 1, // "maxLeverage": "100.00" // }, // .... // ] // }, // "retExtInfo": {}, // "time": 1672054488010 // } // var result interface{} = this.SafeDict(response, "result") var tiers interface{} = this.SafeList(result, "list") ch <- this.ParseMarketLeverageTiers(tiers, market) return nil }() return ch } /** * @method * @name bybit#fetchMarketLeverageTiers * @description retrieve information on the maximum leverage, and maintenance margin for trades of varying trade sizes for a single market * @see https://bybit-exchange.github.io/docs/v5/market/risk-limit * @param {string} symbol unified market symbol * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a [leverage tiers structure]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure} */ func (this *bybit) FetchMarketLeverageTiers(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes75268 := (<-this.LoadMarkets()) PanicOnError(retRes75268) var request interface{} = map[string]interface{} {} var market interface{} = nil market = this.Market(symbol) if IsTrue(IsTrue(GetValue(market, "spot")) || IsTrue(GetValue(market, "option"))) { panic(BadRequest(Add(Add(this.Id, " fetchMarketLeverageTiers() symbol does not support market "), symbol))) } AddElementToObject(request, "symbol", GetValue(market, "id")) retRes753415 := (<-this.FetchDerivativesMarketLeverageTiers(symbol, params)) PanicOnError(retRes753415) ch <- retRes753415 return nil }() return ch } func (this *bybit) ParseTradingFee(fee interface{}, optionalArgs ...interface{}) interface{} { // // { // "symbol": "ETHUSDT", // "makerFeeRate": 0.001, // "takerFeeRate": 0.001 // } // market := GetArg(optionalArgs, 0, nil) _ = market var marketId interface{} = this.SafeString(fee, "symbol") var defaultType interface{} = Ternary(IsTrue((!IsEqual(market, nil))), GetValue(market, "type"), "contract") var symbol interface{} = this.SafeSymbol(marketId, market, nil, defaultType) return map[string]interface{} { "info": fee, "symbol": symbol, "maker": this.SafeNumber(fee, "makerFeeRate"), "taker": this.SafeNumber(fee, "takerFeeRate"), "percentage": nil, "tierBased": nil, } } /** * @method * @name bybit#fetchTradingFee * @description fetch the trading fees for a market * @see https://bybit-exchange.github.io/docs/v5/account/fee-rate * @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 *bybit) 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 retRes75688 := (<-this.LoadMarkets()) PanicOnError(retRes75688) var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), } var category interface{} = nil if IsTrue(GetValue(market, "linear")) { category = "linear" } else if IsTrue(GetValue(market, "inverse")) { category = "inverse" } else if IsTrue(GetValue(market, "spot")) { category = "spot" } else { category = "option" } AddElementToObject(request, "category", category) response:= (<-this.PrivateGetV5AccountFeeRate(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "list": [ // { // "symbol": "ETHUSDT", // "takerFeeRate": "0.0006", // "makerFeeRate": "0.0001" // } // ] // }, // "retExtInfo": {}, // "time": 1676360412576 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var fees interface{} = this.SafeList(result, "list", []interface{}{}) var first interface{} = this.SafeDict(fees, 0, map[string]interface{} {}) ch <- this.ParseTradingFee(first, market) return nil }() return ch } /** * @method * @name bybit#fetchTradingFees * @description fetch the trading fees for multiple markets * @see https://bybit-exchange.github.io/docs/v5/account/fee-rate * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @returns {object} a dictionary of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} indexed by market symbols */ func (this *bybit) FetchTradingFees(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes76188 := (<-this.LoadMarkets()) PanicOnError(retRes76188) var typeVar interface{} = nil typeVarparamsVariable := this.HandleOptionAndParams(params, "fetchTradingFees", "type", "future"); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(IsEqual(typeVar, "spot")) { panic(NotSupported(Add(this.Id, " fetchTradingFees() is not supported for spot market"))) } response:= (<-this.PrivateGetV5AccountFeeRate(params)) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "list": [ // { // "symbol": "ETHUSDT", // "takerFeeRate": "0.0006", // "makerFeeRate": "0.0001" // } // ] // }, // "retExtInfo": {}, // "time": 1676360412576 // } // var fees interface{} = this.SafeDict(response, "result", map[string]interface{} {}) fees = this.SafeList(fees, "list", []interface{}{}) var result interface{} = map[string]interface{} {} for i := 0; IsLessThan(i, GetArrayLength(fees)); i++ { var fee interface{} = this.ParseTradingFee(GetValue(fees, i)) var symbol interface{} = GetValue(fee, "symbol") AddElementToObject(result, symbol, fee) } ch <- result return nil }() return ch } func (this *bybit) ParseDepositWithdrawFee(fee interface{}, optionalArgs ...interface{}) interface{} { // // { // "name": "BTC", // "coin": "BTC", // "remainAmount": "150", // "chains": [ // { // "chainType": "BTC", // "confirmation": "10000", // "withdrawFee": "0.0005", // "depositMin": "0.0005", // "withdrawMin": "0.001", // "chain": "BTC", // "chainDeposit": "1", // "chainWithdraw": "1", // "minAccuracy": "8" // } // ] // } // currency := GetArg(optionalArgs, 0, nil) _ = currency var chains interface{} = this.SafeList(fee, "chains", []interface{}{}) var chainsLength interface{} = GetArrayLength(chains) var result interface{} = map[string]interface{} { "info": fee, "withdraw": map[string]interface{} { "fee": nil, "percentage": nil, }, "deposit": map[string]interface{} { "fee": nil, "percentage": nil, }, "networks": map[string]interface{} {}, } if IsTrue(!IsEqual(chainsLength, 0)) { for i := 0; IsLessThan(i, chainsLength); i++ { var chain interface{} = GetValue(chains, i) var networkId interface{} = this.SafeString(chain, "chain") var currencyCode interface{} = this.SafeString(currency, "code") var networkCode interface{} = this.NetworkIdToCode(networkId, currencyCode) AddElementToObject(GetValue(result, "networks"), networkCode, map[string]interface{} { "deposit": map[string]interface{} { "fee": nil, "percentage": nil, }, "withdraw": map[string]interface{} { "fee": this.SafeNumber(chain, "withdrawFee"), "percentage": false, }, }) if IsTrue(IsEqual(chainsLength, 1)) { AddElementToObject(GetValue(result, "withdraw"), "fee", this.SafeNumber(chain, "withdrawFee")) AddElementToObject(GetValue(result, "withdraw"), "percentage", false) } } } return result } /** * @method * @name bybit#fetchDepositWithdrawFees * @description fetch deposit and withdraw fees * @see https://bybit-exchange.github.io/docs/v5/asset/coin-info * @param {string[]} codes list of unified currency codes * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a list of [fee structures]{@link https://docs.ccxt.com/#/?id=fee-structure} */ func (this *bybit) 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 this.CheckRequiredCredentials() retRes77188 := (<-this.LoadMarkets()) PanicOnError(retRes77188) response:= (<-this.PrivateGetV5AssetCoinQueryInfo(params)) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "", // "result": { // "rows": [ // { // "name": "BTC", // "coin": "BTC", // "remainAmount": "150", // "chains": [ // { // "chainType": "BTC", // "confirmation": "10000", // "withdrawFee": "0.0005", // "depositMin": "0.0005", // "withdrawMin": "0.001", // "chain": "BTC", // "chainDeposit": "1", // "chainWithdraw": "1", // "minAccuracy": "8" // } // ] // } // ] // }, // "retExtInfo": {}, // "time": 1672194582264 // } // var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var rows interface{} = this.SafeList(data, "rows", []interface{}{}) ch <- this.ParseDepositWithdrawFees(rows, codes, "coin") return nil }() return ch } /** * @method * @name bybit#fetchSettlementHistory * @description fetches historical settlement records * @see https://bybit-exchange.github.io/docs/v5/market/delivery-price * @param {string} symbol unified market symbol of the settlement history * @param {int} [since] timestamp in ms * @param {int} [limit] number of records * @param {object} [params] exchange specific params * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @returns {object[]} a list of [settlement history objects] */ func (this *bybit) FetchSettlementHistory(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbol := GetArg(optionalArgs, 0, nil) _ = symbol since := GetArg(optionalArgs, 1, nil) _ = since limit := GetArg(optionalArgs, 2, nil) _ = limit params := GetArg(optionalArgs, 3, map[string]interface{} {}) _ = params retRes77698 := (<-this.LoadMarkets()) PanicOnError(retRes77698) 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 typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchSettlementHistory", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(IsEqual(typeVar, "spot")) { panic(NotSupported(Add(this.Id, " fetchSettlementHistory() is not supported for spot market"))) } AddElementToObject(request, "category", typeVar) if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } response:= (<-this.PublicGetV5MarketDeliveryPrice(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "category": "option", // "nextPageCursor": "0%2C3", // "list": [ // { // "symbol": "SOL-27JUN23-20-C", // "deliveryPrice": "16.62258889", // "deliveryTime": "1687852800000" // }, // ] // }, // "retExtInfo": {}, // "time": 1689043527231 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var data interface{} = this.SafeList(result, "list", []interface{}{}) var settlements interface{} = this.ParseSettlements(data, market) var sorted interface{} = this.SortBy(settlements, "timestamp") ch <- this.FilterBySymbolSinceLimit(sorted, GetValue(market, "symbol"), since, limit) return nil }() return ch } /** * @method * @name bybit#fetchMySettlementHistory * @description fetches historical settlement records of the user * @see https://bybit-exchange.github.io/docs/v5/asset/delivery * @param {string} symbol unified market symbol of the settlement history * @param {int} [since] timestamp in ms * @param {int} [limit] number of records * @param {object} [params] exchange specific params * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @returns {object[]} a list of [settlement history objects] */ func (this *bybit) FetchMySettlementHistory(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbol := GetArg(optionalArgs, 0, nil) _ = symbol since := GetArg(optionalArgs, 1, nil) _ = since limit := GetArg(optionalArgs, 2, nil) _ = limit params := GetArg(optionalArgs, 3, map[string]interface{} {}) _ = params retRes78268 := (<-this.LoadMarkets()) PanicOnError(retRes78268) 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 typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchMySettlementHistory", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "inverse"))) { panic(NotSupported(Add(this.Id, " fetchMySettlementHistory() is not supported for spot market"))) } AddElementToObject(request, "category", "linear") if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } response:= (<-this.PrivateGetV5AssetDeliveryRecord(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "success", // "result": { // "category": "option", // "nextPageCursor": "0%2C3", // "list": [ // { // "symbol": "SOL-27JUN23-20-C", // "deliveryPrice": "16.62258889", // "deliveryTime": "1687852800000", // "side": "Buy", // "strike": "20", // "fee": "0.00000000", // "position": "0.01", // "deliveryRpl": "3.5" // }, // ] // }, // "retExtInfo": {}, // "time": 1689043527231 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var data interface{} = this.SafeList(result, "list", []interface{}{}) var settlements interface{} = this.ParseSettlements(data, market) var sorted interface{} = this.SortBy(settlements, "timestamp") ch <- this.FilterBySymbolSinceLimit(sorted, GetValue(market, "symbol"), since, limit) return nil }() return ch } func (this *bybit) ParseSettlement(settlement interface{}, market interface{}) interface{} { // // fetchSettlementHistory // // { // "symbol": "SOL-27JUN23-20-C", // "deliveryPrice": "16.62258889", // "deliveryTime": "1687852800000" // } // // fetchMySettlementHistory // // { // "symbol": "SOL-27JUN23-20-C", // "deliveryPrice": "16.62258889", // "deliveryTime": "1687852800000", // "side": "Buy", // "strike": "20", // "fee": "0.00000000", // "position": "0.01", // "deliveryRpl": "3.5" // } // var timestamp interface{} = this.SafeInteger(settlement, "deliveryTime") var marketId interface{} = this.SafeString(settlement, "symbol") return map[string]interface{} { "info": settlement, "symbol": this.SafeSymbol(marketId, market), "price": this.SafeNumber(settlement, "deliveryPrice"), "timestamp": timestamp, "datetime": this.Iso8601(timestamp), } } func (this *bybit) ParseSettlements(settlements interface{}, market interface{}) interface{} { // // fetchSettlementHistory // // [ // { // "symbol": "SOL-27JUN23-20-C", // "deliveryPrice": "16.62258889", // "deliveryTime": "1687852800000" // } // ] // // fetchMySettlementHistory // // [ // { // "symbol": "SOL-27JUN23-20-C", // "deliveryPrice": "16.62258889", // "deliveryTime": "1687852800000", // "side": "Buy", // "strike": "20", // "fee": "0.00000000", // "position": "0.01", // "deliveryRpl": "3.5" // } // ] // var result interface{} = []interface{}{} for i := 0; IsLessThan(i, GetArrayLength(settlements)); i++ { AppendToArray(&result,this.ParseSettlement(GetValue(settlements, i), market)) } return result } /** * @method * @name bybit#fetchVolatilityHistory * @description fetch the historical volatility of an option market based on an underlying asset * @see https://bybit-exchange.github.io/docs/v5/market/iv * @param {string} code unified currency code * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {int} [params.period] the period in days to fetch the volatility for: 7,14,21,30,60,90,180,270 * @returns {object[]} a list of [volatility history objects]{@link https://docs.ccxt.com/#/?id=volatility-structure} */ func (this *bybit) FetchVolatilityHistory(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 retRes79538 := (<-this.LoadMarkets()) PanicOnError(retRes79538) var currency interface{} = this.Currency(code) var request interface{} = map[string]interface{} { "category": "option", "baseCoin": GetValue(currency, "id"), } response:= (<-this.PublicGetV5MarketHistoricalVolatility(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "SUCCESS", // "category": "option", // "result": [ // { // "period": 7, // "value": "0.23854072", // "time": "1690574400000" // } // ] // } // var volatility interface{} = this.SafeList(response, "result", []interface{}{}) ch <- this.ParseVolatilityHistory(volatility) return nil }() return ch } func (this *bybit) ParseVolatilityHistory(volatility interface{}) interface{} { // // { // "period": 7, // "value": "0.23854072", // "time": "1690574400000" // } // var result interface{} = []interface{}{} for i := 0; IsLessThan(i, GetArrayLength(volatility)); i++ { var entry interface{} = GetValue(volatility, i) var timestamp interface{} = this.SafeInteger(entry, "time") AppendToArray(&result,map[string]interface{} { "info": volatility, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "volatility": this.SafeNumber(entry, "value"), }) } return result } /** * @method * @name bybit#fetchGreeks * @description fetches an option contracts greeks, financial metrics used to measure the factors that affect the price of an options contract * @see https://bybit-exchange.github.io/docs/api-explorer/v5/market/tickers * @param {string} symbol unified symbol of the market to fetch greeks for * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a [greeks structure]{@link https://docs.ccxt.com/#/?id=greeks-structure} */ func (this *bybit) FetchGreeks(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes80108 := (<-this.LoadMarkets()) PanicOnError(retRes80108) var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), "category": "option", } response:= (<-this.PublicGetV5MarketTickers(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "SUCCESS", // "result": { // "category": "option", // "list": [ // { // "symbol": "BTC-26JAN24-39000-C", // "bid1Price": "3205", // "bid1Size": "7.1", // "bid1Iv": "0.5478", // "ask1Price": "3315", // "ask1Size": "1.98", // "ask1Iv": "0.5638", // "lastPrice": "3230", // "highPrice24h": "3255", // "lowPrice24h": "3200", // "markPrice": "3273.02263032", // "indexPrice": "36790.96", // "markIv": "0.5577", // "underlyingPrice": "37649.67254894", // "openInterest": "19.67", // "turnover24h": "170140.33875912", // "volume24h": "4.56", // "totalVolume": "22", // "totalTurnover": "789305", // "delta": "0.49640971", // "gamma": "0.00004131", // "vega": "69.08651675", // "theta": "-24.9443226", // "predictedDeliveryPrice": "0", // "change24h": "0.18532111" // } // ] // }, // "retExtInfo": {}, // "time": 1699584008326 // } // var timestamp interface{} = this.SafeInteger(response, "time") var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var data interface{} = this.SafeList(result, "list", []interface{}{}) var greeks interface{} = this.ParseGreeks(GetValue(data, 0), market) ch <- this.Extend(greeks, map[string]interface{} { "timestamp": timestamp, "datetime": this.Iso8601(timestamp), }) return nil }() return ch } func (this *bybit) ParseGreeks(greeks interface{}, optionalArgs ...interface{}) interface{} { // // { // "symbol": "BTC-26JAN24-39000-C", // "bid1Price": "3205", // "bid1Size": "7.1", // "bid1Iv": "0.5478", // "ask1Price": "3315", // "ask1Size": "1.98", // "ask1Iv": "0.5638", // "lastPrice": "3230", // "highPrice24h": "3255", // "lowPrice24h": "3200", // "markPrice": "3273.02263032", // "indexPrice": "36790.96", // "markIv": "0.5577", // "underlyingPrice": "37649.67254894", // "openInterest": "19.67", // "turnover24h": "170140.33875912", // "volume24h": "4.56", // "totalVolume": "22", // "totalTurnover": "789305", // "delta": "0.49640971", // "gamma": "0.00004131", // "vega": "69.08651675", // "theta": "-24.9443226", // "predictedDeliveryPrice": "0", // "change24h": "0.18532111" // } // market := GetArg(optionalArgs, 0, nil) _ = market var marketId interface{} = this.SafeString(greeks, "symbol") var symbol interface{} = this.SafeSymbol(marketId, market) return map[string]interface{} { "symbol": symbol, "timestamp": nil, "datetime": nil, "delta": this.SafeNumber(greeks, "delta"), "gamma": this.SafeNumber(greeks, "gamma"), "theta": this.SafeNumber(greeks, "theta"), "vega": this.SafeNumber(greeks, "vega"), "rho": nil, "bidSize": this.SafeNumber(greeks, "bid1Size"), "askSize": this.SafeNumber(greeks, "ask1Size"), "bidImpliedVolatility": this.SafeNumber(greeks, "bid1Iv"), "askImpliedVolatility": this.SafeNumber(greeks, "ask1Iv"), "markImpliedVolatility": this.SafeNumber(greeks, "markIv"), "bidPrice": this.SafeNumber(greeks, "bid1Price"), "askPrice": this.SafeNumber(greeks, "ask1Price"), "markPrice": this.SafeNumber(greeks, "markPrice"), "lastPrice": this.SafeNumber(greeks, "lastPrice"), "underlyingPrice": this.SafeNumber(greeks, "underlyingPrice"), "info": greeks, } } /** * @method * @name bybit#fetchMyLiquidations * @description retrieves the users liquidated positions * @see https://bybit-exchange.github.io/docs/api-explorer/v5/position/execution * @param {string} [symbol] unified CCXT market symbol * @param {int} [since] the earliest time in ms to fetch liquidations for * @param {int} [limit] the maximum number of liquidation structures to retrieve * @param {object} [params] exchange specific parameters for the exchange API endpoint * @param {string} [params.type] market type, ['swap', 'option', 'spot'] * @param {string} [params.subType] market subType, ['linear', 'inverse'] * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {object} an array of [liquidation structures]{@link https://docs.ccxt.com/#/?id=liquidation-structure} */ func (this *bybit) FetchMyLiquidations(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbol := GetArg(optionalArgs, 0, nil) _ = symbol since := GetArg(optionalArgs, 1, nil) _ = since limit := GetArg(optionalArgs, 2, nil) _ = limit params := GetArg(optionalArgs, 3, map[string]interface{} {}) _ = params retRes81378 := (<-this.LoadMarkets()) PanicOnError(retRes81378) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchMyLiquidations", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes814119 := (<-this.FetchPaginatedCallCursor("fetchMyLiquidations", symbol, since, limit, params, "nextPageCursor", "cursor", nil, 100)) PanicOnError(retRes814119) ch <- retRes814119 return nil } var request interface{} = map[string]interface{} { "execType": "BustTrade", } var market interface{} = nil if IsTrue(!IsEqual(symbol, nil)) { market = this.Market(symbol) AddElementToObject(request, "symbol", GetValue(market, "id")) } var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchMyLiquidations", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) AddElementToObject(request, "category", typeVar) if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } requestparamsVariable := this.HandleUntilOption("endTime", request, params); request = GetValue(requestparamsVariable,0); params = GetValue(requestparamsVariable,1) response:= (<-this.PrivateGetV5ExecutionList(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "nextPageCursor": "132766%3A2%2C132766%3A2", // "category": "linear", // "list": [ // { // "symbol": "ETHPERP", // "orderType": "Market", // "underlyingPrice": "", // "orderLinkId": "", // "side": "Buy", // "indexPrice": "", // "orderId": "8c065341-7b52-4ca9-ac2c-37e31ac55c94", // "stopOrderType": "UNKNOWN", // "leavesQty": "0", // "execTime": "1672282722429", // "isMaker": false, // "execFee": "0.071409", // "feeRate": "0.0006", // "execId": "e0cbe81d-0f18-5866-9415-cf319b5dab3b", // "tradeIv": "", // "blockTradeId": "", // "markPrice": "1183.54", // "execPrice": "1190.15", // "markIv": "", // "orderQty": "0.1", // "orderPrice": "1236.9", // "execValue": "119.015", // "execType": "Trade", // "execQty": "0.1" // } // ] // }, // "retExtInfo": {}, // "time": 1672283754510 // } // var liquidations interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseLiquidations(liquidations, market, since, limit) return nil }() return ch } func (this *bybit) ParseLiquidation(liquidation interface{}, optionalArgs ...interface{}) interface{} { // // { // "symbol": "ETHPERP", // "orderType": "Market", // "underlyingPrice": "", // "orderLinkId": "", // "side": "Buy", // "indexPrice": "", // "orderId": "8c065341-7b52-4ca9-ac2c-37e31ac55c94", // "stopOrderType": "UNKNOWN", // "leavesQty": "0", // "execTime": "1672282722429", // "isMaker": false, // "execFee": "0.071409", // "feeRate": "0.0006", // "execId": "e0cbe81d-0f18-5866-9415-cf319b5dab3b", // "tradeIv": "", // "blockTradeId": "", // "markPrice": "1183.54", // "execPrice": "1190.15", // "markIv": "", // "orderQty": "0.1", // "orderPrice": "1236.9", // "execValue": "119.015", // "execType": "Trade", // "execQty": "0.1" // } // market := GetArg(optionalArgs, 0, nil) _ = market var marketId interface{} = this.SafeString(liquidation, "symbol") var timestamp interface{} = this.SafeInteger(liquidation, "execTime") var contractsString interface{} = this.SafeString(liquidation, "execQty") var contractSizeString interface{} = this.SafeString(market, "contractSize") var priceString interface{} = this.SafeString(liquidation, "execPrice") var baseValueString interface{} = Precise.StringMul(contractsString, contractSizeString) var quoteValueString interface{} = Precise.StringMul(baseValueString, priceString) return this.SafeLiquidation(map[string]interface{} { "info": liquidation, "symbol": this.SafeSymbol(marketId, market, nil, "contract"), "contracts": this.ParseNumber(contractsString), "contractSize": this.ParseNumber(contractSizeString), "price": this.ParseNumber(priceString), "baseValue": this.ParseNumber(baseValueString), "quoteValue": this.ParseNumber(quoteValueString), "timestamp": timestamp, "datetime": this.Iso8601(timestamp), }) } func (this *bybit) GetLeverageTiersPaginated(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 retRes82568 := (<-this.LoadMarkets()) PanicOnError(retRes82568) var market interface{} = nil if IsTrue(!IsEqual(symbol, nil)) { market = this.Market(symbol) } var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "getLeverageTiersPaginated", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes826419 := (<-this.FetchPaginatedCallCursor("getLeverageTiersPaginated", symbol, nil, nil, params, "nextPageCursor", "cursor", nil, 100)) PanicOnError(retRes826419) ch <- retRes826419 return nil } var subType interface{} = nil subTypeparamsVariable := this.HandleSubTypeAndParams("getLeverageTiersPaginated", market, params, "linear"); subType = GetValue(subTypeparamsVariable,0); params = GetValue(subTypeparamsVariable,1) var request interface{} = map[string]interface{} { "category": subType, } response:= (<-this.PublicGetV5MarketRiskLimit(this.Extend(request, params))) PanicOnError(response) var result interface{} = this.AddPaginationCursorToResult(response) var first interface{} = this.SafeDict(result, 0) var total interface{} = GetArrayLength(result) var lastIndex interface{} = Subtract(total, 1) var last interface{} = this.SafeDict(result, lastIndex) var cursorValue interface{} = this.SafeString(first, "nextPageCursor") AddElementToObject(last, "info", map[string]interface{} { "nextPageCursor": cursorValue, }) AddElementToObject(result, lastIndex, last) ch <- result return nil }() return ch } /** * @method * @name bybit#fetchLeverageTiers * @description retrieve information on the maximum leverage, for different trade sizes * @see https://bybit-exchange.github.io/docs/v5/market/risk-limit * @param {string[]} [symbols] a list of unified market symbols * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.subType] market subType, ['linear', 'inverse'], default is 'linear' * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {object} a dictionary of [leverage tiers structures]{@link https://docs.ccxt.com/#/?id=leverage-tiers-structure}, indexed by market symbols */ func (this *bybit) 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 retRes82978 := (<-this.LoadMarkets()) PanicOnError(retRes82978) var market interface{} = nil var symbol interface{} = nil if IsTrue(!IsEqual(symbols, nil)) { market = this.Market(GetValue(symbols, 0)) if IsTrue(GetValue(market, "spot")) { panic(NotSupported(Add(this.Id, " fetchLeverageTiers() is not supported for spot market"))) } symbol = GetValue(market, "symbol") } data:= (<-this.GetLeverageTiersPaginated(symbol, this.Extend(map[string]interface{} { "paginate": true, "paginationCalls": 40, }, params))) PanicOnError(data) symbols = this.MarketSymbols(symbols) ch <- this.ParseLeverageTiers(data, symbols, "symbol") return nil }() return ch } func (this *bybit) ParseLeverageTiers(response interface{}, optionalArgs ...interface{}) interface{} { // // [ // { // "id": 1, // "symbol": "BTCUSD", // "riskLimitValue": "150", // "maintenanceMargin": "0.5", // "initialMargin": "1", // "isLowestRisk": 1, // "maxLeverage": "100.00" // } // ] // symbols := GetArg(optionalArgs, 0, nil) _ = symbols marketIdKey := GetArg(optionalArgs, 1, nil) _ = marketIdKey var tiers interface{} = map[string]interface{} {} var marketIds interface{} = this.MarketIds(symbols) var filteredResults interface{} = this.FilterByArray(response, marketIdKey, marketIds, false) var grouped interface{} = this.GroupBy(filteredResults, marketIdKey) var keys interface{} = ObjectKeys(grouped) for i := 0; IsLessThan(i, GetArrayLength(keys)); i++ { var marketId interface{} = GetValue(keys, i) var entry interface{} = GetValue(grouped, marketId) for j := 0; IsLessThan(j, GetArrayLength(entry)); j++ { var id interface{} = this.SafeInteger(GetValue(entry, j), "id") AddElementToObject(GetValue(entry, j), "id", id) } var market interface{} = this.SafeMarket(marketId, nil, nil, "contract") var symbol interface{} = GetValue(market, "symbol") AddElementToObject(tiers, symbol, this.ParseMarketLeverageTiers(this.SortBy(entry, "id"), market)) } return tiers } func (this *bybit) ParseMarketLeverageTiers(info interface{}, optionalArgs ...interface{}) interface{} { // // [ // { // "id": 1, // "symbol": "BTCUSD", // "riskLimitValue": "150", // "maintenanceMargin": "0.5", // "initialMargin": "1", // "isLowestRisk": 1, // "maxLeverage": "100.00" // } // ] // market := GetArg(optionalArgs, 0, nil) _ = market var tiers interface{} = []interface{}{} for i := 0; IsLessThan(i, GetArrayLength(info)); i++ { var tier interface{} = GetValue(info, i) var marketId interface{} = this.SafeString(info, "symbol") market = this.SafeMarket(marketId) var minNotional interface{} = this.ParseNumber("0") if IsTrue(!IsEqual(i, 0)) { minNotional = this.SafeNumber(GetValue(info, Subtract(i, 1)), "riskLimitValue") } AppendToArray(&tiers,map[string]interface{} { "tier": this.SafeInteger(tier, "id"), "symbol": this.SafeSymbol(marketId, market), "currency": GetValue(market, "settle"), "minNotional": minNotional, "maxNotional": this.SafeNumber(tier, "riskLimitValue"), "maintenanceMarginRate": this.SafeNumber(tier, "maintenanceMargin"), "maxLeverage": this.SafeNumber(tier, "maxLeverage"), "info": tier, }) } return tiers } /** * @method * @name bybit#fetchFundingHistory * @description fetch the history of funding payments paid and received on this account * @see https://bybit-exchange.github.io/docs/api-explorer/v5/position/execution * @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 * @param {boolean} [params.paginate] default false, when true will automatically paginate by calling this endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params) * @returns {object} a [funding history structure]{@link https://docs.ccxt.com/#/?id=funding-history-structure} */ func (this *bybit) 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 retRes83958 := (<-this.LoadMarkets()) PanicOnError(retRes83958) var paginate interface{} = false paginateparamsVariable := this.HandleOptionAndParams(params, "fetchFundingHistory", "paginate"); paginate = GetValue(paginateparamsVariable,0); params = GetValue(paginateparamsVariable,1) if IsTrue(paginate) { retRes839919 := (<-this.FetchPaginatedCallCursor("fetchFundingHistory", symbol, since, limit, params, "nextPageCursor", "cursor", nil, 100)) PanicOnError(retRes839919) ch <- retRes839919 return nil } var request interface{} = map[string]interface{} { "execType": "Funding", } var market interface{} = nil if IsTrue(!IsEqual(symbol, nil)) { market = this.Market(symbol) AddElementToObject(request, "symbol", GetValue(market, "id")) } var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchFundingHistory", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) AddElementToObject(request, "category", typeVar) if IsTrue(!IsEqual(symbol, nil)) { AddElementToObject(request, "symbol", GetValue(market, "id")) } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "size", limit) } else { AddElementToObject(request, "size", 100) } requestparamsVariable := this.HandleUntilOption("endTime", request, params); request = GetValue(requestparamsVariable,0); params = GetValue(requestparamsVariable,1) response:= (<-this.PrivateGetV5ExecutionList(this.Extend(request, params))) PanicOnError(response) var fundings interface{} = this.AddPaginationCursorToResult(response) ch <- this.ParseIncomes(fundings, market, since, limit) return nil }() return ch } func (this *bybit) ParseIncome(income interface{}, optionalArgs ...interface{}) interface{} { // // { // "symbol": "XMRUSDT", // "orderType": "UNKNOWN", // "underlyingPrice": "", // "orderLinkId": "", // "orderId": "a11e5fe2-1dbf-4bab-a9b2-af80a14efc5d", // "stopOrderType": "UNKNOWN", // "execTime": "1710950400000", // "feeCurrency": "", // "createType": "", // "feeRate": "-0.000761", // "tradeIv": "", // "blockTradeId": "", // "markPrice": "136.79", // "execPrice": "137.11", // "markIv": "", // "orderQty": "0", // "orderPrice": "0", // "execValue": "134.3678", // "closedSize": "0", // "execType": "Funding", // "seq": "28097658790", // "side": "Sell", // "indexPrice": "", // "leavesQty": "0", // "isMaker": false, // "execFee": "-0.10232512", // "execId": "8d1ef156-4ec6-4445-9a6c-1c0c24dbd046", // "marketUnit": "", // "execQty": "0.98", // "nextPageCursor": "5774437%3A0%2C5771289%3A0" // } // market := GetArg(optionalArgs, 0, nil) _ = market var marketId interface{} = this.SafeString(income, "symbol") market = this.SafeMarket(marketId, market, nil, "contract") var code interface{} = "USDT" if IsTrue(GetValue(market, "inverse")) { code = GetValue(market, "quote") } var timestamp interface{} = this.SafeInteger(income, "execTime") return map[string]interface{} { "info": income, "symbol": this.SafeSymbol(marketId, market, "-", "swap"), "code": code, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "id": this.SafeString(income, "execId"), "amount": this.SafeNumber(income, "execQty"), "rate": this.SafeNumber(income, "feeRate"), } } /** * @method * @name bybit#fetchOption * @description fetches option data that is commonly found in an option chain * @see https://bybit-exchange.github.io/docs/v5/market/tickers * @param {string} symbol unified market symbol * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} an [option chain structure]{@link https://docs.ccxt.com/#/?id=option-chain-structure} */ func (this *bybit) FetchOption(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes84938 := (<-this.LoadMarkets()) PanicOnError(retRes84938) var market interface{} = this.Market(symbol) var request interface{} = map[string]interface{} { "category": "option", "symbol": GetValue(market, "id"), } response:= (<-this.PublicGetV5MarketTickers(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "SUCCESS", // "result": { // "category": "option", // "list": [ // { // "symbol": "BTC-27DEC24-55000-P", // "bid1Price": "0", // "bid1Size": "0", // "bid1Iv": "0", // "ask1Price": "0", // "ask1Size": "0", // "ask1Iv": "0", // "lastPrice": "10980", // "highPrice24h": "0", // "lowPrice24h": "0", // "markPrice": "11814.66756236", // "indexPrice": "63838.92", // "markIv": "0.8866", // "underlyingPrice": "71690.55303594", // "openInterest": "0.01", // "turnover24h": "0", // "volume24h": "0", // "totalVolume": "2", // "totalTurnover": "78719", // "delta": "-0.23284954", // "gamma": "0.0000055", // "vega": "191.70757975", // "theta": "-30.43617927", // "predictedDeliveryPrice": "0", // "change24h": "0" // } // ] // }, // "retExtInfo": {}, // "time": 1711162003672 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var resultList interface{} = this.SafeList(result, "list", []interface{}{}) var chain interface{} = this.SafeDict(resultList, 0, map[string]interface{} {}) ch <- this.ParseOption(chain, nil, market) return nil }() return ch } /** * @method * @name bybit#fetchOptionChain * @description fetches data for an underlying asset that is commonly found in an option chain * @see https://bybit-exchange.github.io/docs/v5/market/tickers * @param {string} code base currency to fetch an option chain for * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a list of [option chain structures]{@link https://docs.ccxt.com/#/?id=option-chain-structure} */ func (this *bybit) FetchOptionChain(code interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes85568 := (<-this.LoadMarkets()) PanicOnError(retRes85568) var currency interface{} = this.Currency(code) var request interface{} = map[string]interface{} { "category": "option", "baseCoin": GetValue(currency, "id"), } response:= (<-this.PublicGetV5MarketTickers(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "SUCCESS", // "result": { // "category": "option", // "list": [ // { // "symbol": "BTC-27DEC24-55000-P", // "bid1Price": "0", // "bid1Size": "0", // "bid1Iv": "0", // "ask1Price": "0", // "ask1Size": "0", // "ask1Iv": "0", // "lastPrice": "10980", // "highPrice24h": "0", // "lowPrice24h": "0", // "markPrice": "11814.66756236", // "indexPrice": "63838.92", // "markIv": "0.8866", // "underlyingPrice": "71690.55303594", // "openInterest": "0.01", // "turnover24h": "0", // "volume24h": "0", // "totalVolume": "2", // "totalTurnover": "78719", // "delta": "-0.23284954", // "gamma": "0.0000055", // "vega": "191.70757975", // "theta": "-30.43617927", // "predictedDeliveryPrice": "0", // "change24h": "0" // }, // ] // }, // "retExtInfo": {}, // "time": 1711162003672 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var resultList interface{} = this.SafeList(result, "list", []interface{}{}) ch <- this.ParseOptionChain(resultList, nil, "symbol") return nil }() return ch } func (this *bybit) ParseOption(chain interface{}, optionalArgs ...interface{}) interface{} { // // { // "symbol": "BTC-27DEC24-55000-P", // "bid1Price": "0", // "bid1Size": "0", // "bid1Iv": "0", // "ask1Price": "0", // "ask1Size": "0", // "ask1Iv": "0", // "lastPrice": "10980", // "highPrice24h": "0", // "lowPrice24h": "0", // "markPrice": "11814.66756236", // "indexPrice": "63838.92", // "markIv": "0.8866", // "underlyingPrice": "71690.55303594", // "openInterest": "0.01", // "turnover24h": "0", // "volume24h": "0", // "totalVolume": "2", // "totalTurnover": "78719", // "delta": "-0.23284954", // "gamma": "0.0000055", // "vega": "191.70757975", // "theta": "-30.43617927", // "predictedDeliveryPrice": "0", // "change24h": "0" // } // currency := GetArg(optionalArgs, 0, nil) _ = currency market := GetArg(optionalArgs, 1, nil) _ = market var marketId interface{} = this.SafeString(chain, "symbol") market = this.SafeMarket(marketId, market) return map[string]interface{} { "info": chain, "currency": nil, "symbol": GetValue(market, "symbol"), "timestamp": nil, "datetime": nil, "impliedVolatility": this.SafeNumber(chain, "markIv"), "openInterest": this.SafeNumber(chain, "openInterest"), "bidPrice": this.SafeNumber(chain, "bid1Price"), "askPrice": this.SafeNumber(chain, "ask1Price"), "midPrice": nil, "markPrice": this.SafeNumber(chain, "markPrice"), "lastPrice": this.SafeNumber(chain, "lastPrice"), "underlyingPrice": this.SafeNumber(chain, "underlyingPrice"), "change": this.SafeNumber(chain, "change24h"), "percentage": nil, "baseVolume": this.SafeNumber(chain, "totalVolume"), "quoteVolume": nil, } } /** * @method * @name bybit#fetchPositionsHistory * @description fetches historical positions * @see https://bybit-exchange.github.io/docs/v5/position/close-pnl * @param {string[]} symbols a list of unified market symbols * @param {int} [since] timestamp in ms of the earliest position to fetch, params["until"] - since <= 7 days * @param {int} [limit] the maximum amount of records to fetch, default=50, max=100 * @param {object} params extra parameters specific to the exchange api endpoint * @param {int} [params.until] timestamp in ms of the latest position to fetch, params["until"] - since <= 7 days * @param {string} [params.subType] 'linear' or 'inverse' * @returns {object[]} a list of [position structures]{@link https://docs.ccxt.com/#/?id=position-structure} */ func (this *bybit) 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 retRes86758 := (<-this.LoadMarkets()) PanicOnError(retRes86758) var market interface{} = nil var subType interface{} = nil var symbolsLength interface{} = 0 if IsTrue(!IsEqual(symbols, nil)) { symbolsLength = GetArrayLength(symbols) if IsTrue(IsGreaterThan(symbolsLength, 0)) { market = this.Market(GetValue(symbols, 0)) } } var until interface{} = this.SafeInteger(params, "until") subTypeparamsVariable := this.HandleSubTypeAndParams("fetchPositionsHistory", market, params, "linear"); subType = GetValue(subTypeparamsVariable,0); params = GetValue(subTypeparamsVariable,1) params = this.Omit(params, "until") var request interface{} = map[string]interface{} { "category": subType, } if IsTrue(IsTrue((!IsEqual(symbols, nil))) && IsTrue((IsEqual(symbolsLength, 1)))) { AddElementToObject(request, "symbol", GetValue(market, "id")) } if IsTrue(!IsEqual(since, nil)) { AddElementToObject(request, "startTime", since) } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } if IsTrue(!IsEqual(until, nil)) { AddElementToObject(request, "endTime", until) } response:= (<-this.PrivateGetV5PositionClosedPnl(this.Extend(request, params))) PanicOnError(response) // // { // retCode: '0', // retMsg: 'OK', // result: { // nextPageCursor: '071749f3-a9fa-427b-b5ca-27b2f52b81de%3A1712717265566520788%2C071749f3-a9fa-427b-b5ca-27b2f52b81de%3A1712717265566520788', // category: 'linear', // list: [ // { // symbol: 'XRPUSDT', // orderType: 'Market', // leverage: '10', // updatedTime: '1712717265572', // side: 'Sell', // orderId: '071749f3-a9fa-427b-b5ca-27b2f52b81de', // closedPnl: '-0.00049568', // avgEntryPrice: '0.6045', // qty: '3', // cumEntryValue: '1.8135', // createdTime: '1712717265566', // orderPrice: '0.5744', // closedSize: '3', // avgExitPrice: '0.605', // execType: 'Trade', // fillCount: '1', // cumExitValue: '1.815' // } // ] // }, // retExtInfo: {}, // time: '1712717286073' // } // var result interface{} = this.SafeDict(response, "result") var rawPositions interface{} = this.SafeList(result, "list") var positions interface{} = this.ParsePositions(rawPositions, symbols, params) ch <- this.FilterBySinceLimit(positions, since, limit) return nil }() return ch } /** * @method * @name bybit#fetchConvertCurrencies * @description fetches all available currencies that can be converted * @see https://bybit-exchange.github.io/docs/v5/asset/convert/convert-coin-list * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.accountType] eb_convert_uta, eb_convert_spot, eb_convert_funding, eb_convert_inverse, or eb_convert_contract * @returns {object} an associative dictionary of currencies */ func (this *bybit) FetchConvertCurrencies(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) params := GetArg(optionalArgs, 0, map[string]interface{} {}) _ = params retRes87538 := (<-this.LoadMarkets()) PanicOnError(retRes87538) var accountType interface{} = nil enableUnifiedMarginenableUnifiedAccountVariable := (<-this.IsUnifiedEnabled()); enableUnifiedMargin := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,0); enableUnifiedAccount := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,1) var isUnifiedAccount interface{} = (IsTrue(enableUnifiedMargin) || IsTrue(enableUnifiedAccount)) var accountTypeDefault interface{} = Ternary(IsTrue(isUnifiedAccount), "eb_convert_uta", "eb_convert_spot") accountTypeparamsVariable := this.HandleOptionAndParams(params, "fetchConvertCurrencies", "accountType", accountTypeDefault); accountType = GetValue(accountTypeparamsVariable,0); params = GetValue(accountTypeparamsVariable,1) var request interface{} = map[string]interface{} { "accountType": accountType, } response:= (<-this.PrivateGetV5AssetExchangeQueryCoinList(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "ok", // "result": { // "coins": [ // { // "coin": "MATIC", // "fullName": "MATIC", // "icon": "https://s1.bycsi.com/app/assets/token/0552ae79c535c3095fa18f7b377dd2e9.svg", // "iconNight": "https://t1.bycsi.com/app/assets/token/f59301aef2d6ac2165c4c4603e672fb4.svg", // "accuracyLength": 8, // "coinType": "crypto", // "balance": "0", // "uBalance": "0", // "timePeriod": 0, // "singleFromMinLimit": "1.1", // "singleFromMaxLimit": "20001", // "singleToMinLimit": "0", // "singleToMaxLimit": "0", // "dailyFromMinLimit": "0", // "dailyFromMaxLimit": "0", // "dailyToMinLimit": "0", // "dailyToMaxLimit": "0", // "disableFrom": false, // "disableTo": false // }, // ] // }, // "retExtInfo": {}, // "time": 1727256416250 // } // var result interface{} = map[string]interface{} {} var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var coins interface{} = this.SafeList(data, "coins", []interface{}{}) for i := 0; IsLessThan(i, GetArrayLength(coins)); i++ { var entry interface{} = GetValue(coins, i) var id interface{} = this.SafeString(entry, "coin") var disableFrom interface{} = this.SafeBool(entry, "disableFrom") var disableTo interface{} = this.SafeBool(entry, "disableTo") var inactive interface{} = (IsTrue(disableFrom) || IsTrue(disableTo)) var code interface{} = this.SafeCurrencyCode(id) AddElementToObject(result, code, map[string]interface{} { "info": entry, "id": id, "code": code, "networks": nil, "type": this.SafeString(entry, "coinType"), "name": this.SafeString(entry, "fullName"), "active": !IsTrue(inactive), "deposit": nil, "withdraw": this.SafeNumber(entry, "balance"), "fee": nil, "precision": nil, "limits": map[string]interface{} { "amount": map[string]interface{} { "min": this.SafeNumber(entry, "singleFromMinLimit"), "max": this.SafeNumber(entry, "singleFromMaxLimit"), }, "withdraw": map[string]interface{} { "min": nil, "max": nil, }, "deposit": map[string]interface{} { "min": nil, "max": nil, }, }, "created": nil, }) } ch <- result return nil }() return ch } /** * @method * @name bybit#fetchConvertQuote * @description fetch a quote for converting from one currency to another * @see https://bybit-exchange.github.io/docs/v5/asset/convert/apply-quote * @param {string} fromCode the currency that you want to sell and convert from * @param {string} toCode the currency that you want to buy and convert into * @param {float} [amount] how much you want to trade in units of the from currency * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.accountType] eb_convert_uta, eb_convert_spot, eb_convert_funding, eb_convert_inverse, or eb_convert_contract * @returns {object} a [conversion structure]{@link https://docs.ccxt.com/#/?id=conversion-structure} */ func (this *bybit) FetchConvertQuote(fromCode interface{}, toCode interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) amount := GetArg(optionalArgs, 0, nil) _ = amount params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params retRes88518 := (<-this.LoadMarkets()) PanicOnError(retRes88518) var accountType interface{} = nil enableUnifiedMarginenableUnifiedAccountVariable := (<-this.IsUnifiedEnabled()); enableUnifiedMargin := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,0); enableUnifiedAccount := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,1) var isUnifiedAccount interface{} = (IsTrue(enableUnifiedMargin) || IsTrue(enableUnifiedAccount)) var accountTypeDefault interface{} = Ternary(IsTrue(isUnifiedAccount), "eb_convert_uta", "eb_convert_spot") accountTypeparamsVariable := this.HandleOptionAndParams(params, "fetchConvertQuote", "accountType", accountTypeDefault); accountType = GetValue(accountTypeparamsVariable,0); params = GetValue(accountTypeparamsVariable,1) var request interface{} = map[string]interface{} { "fromCoin": fromCode, "toCoin": toCode, "requestAmount": this.NumberToString(amount), "requestCoin": fromCode, "accountType": accountType, } response:= (<-this.PrivatePostV5AssetExchangeQuoteApply(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "ok", // "result": { // "quoteTxId": "1010020692439481682687668224", // "exchangeRate": "0.000015330836780000", // "fromCoin": "USDT", // "fromCoinType": "crypto", // "toCoin": "BTC", // "toCoinType": "crypto", // "fromAmount": "10", // "toAmount": "0.000153308367800000", // "expiredTime": "1727257413353", // "requestId": "" // }, // "retExtInfo": {}, // "time": 1727257398375 // } // var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var fromCurrencyId interface{} = this.SafeString(data, "fromCoin", fromCode) var fromCurrency interface{} = this.Currency(fromCurrencyId) var toCurrencyId interface{} = this.SafeString(data, "toCoin", toCode) var toCurrency interface{} = this.Currency(toCurrencyId) ch <- this.ParseConversion(data, fromCurrency, toCurrency) return nil }() return ch } /** * @method * @name bybit#createConvertTrade * @description convert from one currency to another * @see https://bybit-exchange.github.io/docs/v5/asset/convert/confirm-quote * @param {string} id the id of the trade that you want to make * @param {string} fromCode the currency that you want to sell and convert from * @param {string} toCode the currency that you want to buy and convert into * @param {float} amount how much you want to trade in units of the from currency * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object} a [conversion structure]{@link https://docs.ccxt.com/#/?id=conversion-structure} */ func (this *bybit) CreateConvertTrade(id interface{}, fromCode interface{}, toCode interface{}, optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) amount := GetArg(optionalArgs, 0, nil) _ = amount params := GetArg(optionalArgs, 1, map[string]interface{} {}) _ = params retRes89068 := (<-this.LoadMarkets()) PanicOnError(retRes89068) var request interface{} = map[string]interface{} { "quoteTxId": id, } response:= (<-this.PrivatePostV5AssetExchangeConvertExecute(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "ok", // "result": { // "exchangeStatus": "processing", // "quoteTxId": "1010020692439483803499737088" // }, // "retExtInfo": {}, // "time": 1727257904969 // } // var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) ch <- this.ParseConversion(data) return nil }() return ch } /** * @method * @name bybit#fetchConvertTrade * @description fetch the data for a conversion trade * @see https://bybit-exchange.github.io/docs/v5/asset/convert/get-convert-result * @param {string} id the id of the trade that you want to fetch * @param {string} [code] the unified currency code of the conversion trade * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.accountType] eb_convert_uta, eb_convert_spot, eb_convert_funding, eb_convert_inverse, or eb_convert_contract * @returns {object} a [conversion structure]{@link https://docs.ccxt.com/#/?id=conversion-structure} */ func (this *bybit) FetchConvertTrade(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 retRes89398 := (<-this.LoadMarkets()) PanicOnError(retRes89398) var accountType interface{} = nil enableUnifiedMarginenableUnifiedAccountVariable := (<-this.IsUnifiedEnabled()); enableUnifiedMargin := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,0); enableUnifiedAccount := GetValue(enableUnifiedMarginenableUnifiedAccountVariable,1) var isUnifiedAccount interface{} = (IsTrue(enableUnifiedMargin) || IsTrue(enableUnifiedAccount)) var accountTypeDefault interface{} = Ternary(IsTrue(isUnifiedAccount), "eb_convert_uta", "eb_convert_spot") accountTypeparamsVariable := this.HandleOptionAndParams(params, "fetchConvertQuote", "accountType", accountTypeDefault); accountType = GetValue(accountTypeparamsVariable,0); params = GetValue(accountTypeparamsVariable,1) var request interface{} = map[string]interface{} { "quoteTxId": id, "accountType": accountType, } response:= (<-this.PrivateGetV5AssetExchangeConvertResultQuery(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "ok", // "result": { // "result": { // "accountType": "eb_convert_uta", // "exchangeTxId": "1010020692439483803499737088", // "userId": "100406395", // "fromCoin": "USDT", // "fromCoinType": "crypto", // "fromAmount": "10", // "toCoin": "BTC", // "toCoinType": "crypto", // "toAmount": "0.00015344889", // "exchangeStatus": "success", // "extInfo": {}, // "convertRate": "0.000015344889", // "createdAt": "1727257904726" // } // }, // "retExtInfo": {}, // "time": 1727258257216 // } // var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var result interface{} = this.SafeDict(data, "result", map[string]interface{} {}) var fromCurrencyId interface{} = this.SafeString(result, "fromCoin") var toCurrencyId interface{} = this.SafeString(result, "toCoin") var fromCurrency interface{} = nil var toCurrency interface{} = nil if IsTrue(!IsEqual(fromCurrencyId, nil)) { fromCurrency = this.Currency(fromCurrencyId) } if IsTrue(!IsEqual(toCurrencyId, nil)) { toCurrency = this.Currency(toCurrencyId) } ch <- this.ParseConversion(result, fromCurrency, toCurrency) return nil }() return ch } /** * @method * @name bybit#fetchConvertTradeHistory * @description fetch the users history of conversion trades * @see https://bybit-exchange.github.io/docs/v5/asset/convert/get-convert-history * @param {string} [code] the unified currency code * @param {int} [since] the earliest time in ms to fetch conversions for * @param {int} [limit] the maximum number of conversion structures to retrieve * @param {object} [params] extra parameters specific to the exchange API endpoint * @param {string} [params.accountType] eb_convert_uta, eb_convert_spot, eb_convert_funding, eb_convert_inverse, or eb_convert_contract * @returns {object[]} a list of [conversion structures]{@link https://docs.ccxt.com/#/?id=conversion-structure} */ func (this *bybit) FetchConvertTradeHistory(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) code := GetArg(optionalArgs, 0, nil) _ = code since := GetArg(optionalArgs, 1, nil) _ = since limit := GetArg(optionalArgs, 2, nil) _ = limit params := GetArg(optionalArgs, 3, map[string]interface{} {}) _ = params retRes90038 := (<-this.LoadMarkets()) PanicOnError(retRes90038) var request interface{} = map[string]interface{} {} if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } response:= (<-this.PrivateGetV5AssetExchangeQueryConvertHistory(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "ok", // "result": { // "list": [ // { // "accountType": "eb_convert_uta", // "exchangeTxId": "1010020692439483803499737088", // "userId": "100406395", // "fromCoin": "USDT", // "fromCoinType": "crypto", // "fromAmount": "10", // "toCoin": "BTC", // "toCoinType": "crypto", // "toAmount": "0.00015344889", // "exchangeStatus": "success", // "extInfo": {}, // "convertRate": "0.000015344889", // "createdAt": "1727257904726" // } // ] // }, // "retExtInfo": {}, // "time": 1727258761874 // } // var data interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var dataList interface{} = this.SafeList(data, "list", []interface{}{}) ch <- this.ParseConversions(dataList, code, "fromCoin", "toCoin", since, limit) return nil }() return ch } func (this *bybit) ParseConversion(conversion interface{}, optionalArgs ...interface{}) interface{} { // // fetchConvertQuote // // { // "quoteTxId": "1010020692439481682687668224", // "exchangeRate": "0.000015330836780000", // "fromCoin": "USDT", // "fromCoinType": "crypto", // "toCoin": "BTC", // "toCoinType": "crypto", // "fromAmount": "10", // "toAmount": "0.000153308367800000", // "expiredTime": "1727257413353", // "requestId": "" // } // // createConvertTrade // // { // "exchangeStatus": "processing", // "quoteTxId": "1010020692439483803499737088" // } // // fetchConvertTrade, fetchConvertTradeHistory // // { // "accountType": "eb_convert_uta", // "exchangeTxId": "1010020692439483803499737088", // "userId": "100406395", // "fromCoin": "USDT", // "fromCoinType": "crypto", // "fromAmount": "10", // "toCoin": "BTC", // "toCoinType": "crypto", // "toAmount": "0.00015344889", // "exchangeStatus": "success", // "extInfo": {}, // "convertRate": "0.000015344889", // "createdAt": "1727257904726" // } // fromCurrency := GetArg(optionalArgs, 0, nil) _ = fromCurrency toCurrency := GetArg(optionalArgs, 1, nil) _ = toCurrency var timestamp interface{} = this.SafeInteger2(conversion, "expiredTime", "createdAt") var fromCoin interface{} = this.SafeString(conversion, "fromCoin") var fromCode interface{} = this.SafeCurrencyCode(fromCoin, fromCurrency) var to interface{} = this.SafeString(conversion, "toCoin") var toCode interface{} = this.SafeCurrencyCode(to, toCurrency) return map[string]interface{} { "info": conversion, "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "id": this.SafeString2(conversion, "quoteTxId", "exchangeTxId"), "fromCurrency": fromCode, "fromAmount": this.SafeNumber(conversion, "fromAmount"), "toCurrency": toCode, "toAmount": this.SafeNumber(conversion, "toAmount"), "price": nil, "fee": nil, } } /** * @method * @name bybit#fetchLongShortRatioHistory * @description fetches the long short ratio history for a unified market symbol * @see https://bybit-exchange.github.io/docs/v5/market/long-short-ratio * @param {string} symbol unified symbol of the market to fetch the long short ratio for * @param {string} [timeframe] the period for the ratio, default is 24 hours * @param {int} [since] the earliest time in ms to fetch ratios for * @param {int} [limit] the maximum number of long short ratio structures to retrieve * @param {object} [params] extra parameters specific to the exchange API endpoint * @returns {object[]} an array of [long short ratio structures]{@link https://docs.ccxt.com/#/?id=long-short-ratio-structure} */ func (this *bybit) FetchLongShortRatioHistory(optionalArgs ...interface{}) <- chan interface{} { ch := make(chan interface{}) go func() interface{} { defer close(ch) defer ReturnPanicError(ch) symbol := GetArg(optionalArgs, 0, nil) _ = symbol timeframe := GetArg(optionalArgs, 1, nil) _ = timeframe since := GetArg(optionalArgs, 2, nil) _ = since limit := GetArg(optionalArgs, 3, nil) _ = limit params := GetArg(optionalArgs, 4, map[string]interface{} {}) _ = params retRes91158 := (<-this.LoadMarkets()) PanicOnError(retRes91158) var market interface{} = this.Market(symbol) var typeVar interface{} = nil typeVarparamsVariable := this.GetBybitType("fetchLongShortRatioHistory", market, params); typeVar = GetValue(typeVarparamsVariable,0); params = GetValue(typeVarparamsVariable,1) if IsTrue(IsTrue(IsEqual(typeVar, "spot")) || IsTrue(IsEqual(typeVar, "option"))) { panic(NotSupported(Add(this.Id, " fetchLongShortRatioHistory() only support linear and inverse markets"))) } if IsTrue(IsEqual(timeframe, nil)) { timeframe = "1d" } var request interface{} = map[string]interface{} { "symbol": GetValue(market, "id"), "period": timeframe, "category": typeVar, } if IsTrue(!IsEqual(limit, nil)) { AddElementToObject(request, "limit", limit) } response:= (<-this.PublicGetV5MarketAccountRatio(this.Extend(request, params))) PanicOnError(response) // // { // "retCode": 0, // "retMsg": "OK", // "result": { // "list": [ // { // "symbol": "BTCUSDT", // "buyRatio": "0.5707", // "sellRatio": "0.4293", // "timestamp": "1729123200000" // }, // ] // }, // "retExtInfo": {}, // "time": 1729147842516 // } // var result interface{} = this.SafeDict(response, "result", map[string]interface{} {}) var data interface{} = this.SafeList(result, "list", []interface{}{}) ch <- this.ParseLongShortRatioHistory(data, market) return nil }() return ch } func (this *bybit) ParseLongShortRatio(info interface{}, optionalArgs ...interface{}) interface{} { // // { // "symbol": "BTCUSDT", // "buyRatio": "0.5707", // "sellRatio": "0.4293", // "timestamp": "1729123200000" // } // market := GetArg(optionalArgs, 0, nil) _ = market var marketId interface{} = this.SafeString(info, "symbol") var timestamp interface{} = this.SafeIntegerOmitZero(info, "timestamp") var longString interface{} = this.SafeString(info, "buyRatio") var shortString interface{} = this.SafeString(info, "sellRatio") return map[string]interface{} { "info": info, "symbol": this.SafeSymbol(marketId, market, nil, "contract"), "timestamp": timestamp, "datetime": this.Iso8601(timestamp), "timeframe": nil, "longShortRatio": this.ParseToNumeric(Precise.StringDiv(longString, shortString)), } } func (this *bybit) 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 url interface{} = Add(Add(this.ImplodeHostname(GetValue(GetValue(this.Urls, "api"), api)), "/"), path) if IsTrue(IsEqual(api, "public")) { if IsTrue(GetArrayLength(ObjectKeys(params))) { url = Add(url, Add("?", this.Rawencode(params))) } } else if IsTrue(IsEqual(api, "private")) { this.CheckRequiredCredentials() var isOpenapi interface{} = IsGreaterThanOrEqual(GetIndexOf(url, "openapi"), 0) var isV3UnifiedMargin interface{} = IsGreaterThanOrEqual(GetIndexOf(url, "unified/v3"), 0) var isV3Contract interface{} = IsGreaterThanOrEqual(GetIndexOf(url, "contract/v3"), 0) var isV5UnifiedAccount interface{} = IsGreaterThanOrEqual(GetIndexOf(url, "v5"), 0) var timestamp interface{} = ToString(this.Nonce()) if IsTrue(isOpenapi) { if IsTrue(GetArrayLength(ObjectKeys(params))) { body = this.Json(params) } else { // this fix for PHP is required otherwise it generates // '[]' on empty arrays even when forced to use objects body = "{}" } var payload interface{} = Add(Add(timestamp, this.ApiKey), body) var signature interface{} = this.Hmac(this.Encode(payload), this.Encode(this.Secret), sha256, "hex") headers = map[string]interface{} { "Content-Type": "application/json", "X-BAPI-API-KEY": this.ApiKey, "X-BAPI-TIMESTAMP": timestamp, "X-BAPI-SIGN": signature, } } else if IsTrue(IsTrue(IsTrue(isV3UnifiedMargin) || IsTrue(isV3Contract)) || IsTrue(isV5UnifiedAccount)) { headers = map[string]interface{} { "Content-Type": "application/json", "X-BAPI-API-KEY": this.ApiKey, "X-BAPI-TIMESTAMP": timestamp, "X-BAPI-RECV-WINDOW": ToString(GetValue(this.Options, "recvWindow")), } if IsTrue(IsTrue(isV3UnifiedMargin) || IsTrue(isV3Contract)) { AddElementToObject(headers, "X-BAPI-SIGN-TYPE", "2") } var query interface{} = this.Extend(map[string]interface{} {}, params) var queryEncoded interface{} = this.Rawencode(query) var auth_base interface{} = Add(Add(ToString(timestamp), this.ApiKey), ToString(GetValue(this.Options, "recvWindow"))) var authFull interface{} = nil if IsTrue(IsEqual(method, "POST")) { body = this.Json(query) authFull = Add(auth_base, body) } else { authFull = Add(auth_base, queryEncoded) url = Add(url, Add("?", this.Rawencode(query))) } var signature interface{} = nil if IsTrue(IsGreaterThan(GetIndexOf(this.Secret, "PRIVATE KEY"), OpNeg(1))) { signature = Rsa(authFull, this.Secret, sha256) } else { signature = this.Hmac(this.Encode(authFull), this.Encode(this.Secret), sha256) } AddElementToObject(headers, "X-BAPI-SIGN", signature) } else { var query interface{} = this.Extend(params, map[string]interface{} { "api_key": this.ApiKey, "recv_window": GetValue(this.Options, "recvWindow"), "timestamp": timestamp, }) var sortedQuery interface{} = this.Keysort(query) var auth interface{} = this.Rawencode(sortedQuery) var signature interface{} = nil if IsTrue(IsGreaterThan(GetIndexOf(this.Secret, "PRIVATE KEY"), OpNeg(1))) { signature = Rsa(auth, this.Secret, sha256) } else { signature = this.Hmac(this.Encode(auth), this.Encode(this.Secret), sha256) } if IsTrue(IsEqual(method, "POST")) { var isSpot interface{} = IsGreaterThanOrEqual(GetIndexOf(url, "spot"), 0) var extendedQuery interface{} = this.Extend(query, map[string]interface{} { "sign": signature, }) if IsTrue(isSpot) { body = this.Urlencode(extendedQuery) headers = map[string]interface{} { "Content-Type": "application/x-www-form-urlencoded", } } else { body = this.Json(extendedQuery) headers = map[string]interface{} { "Content-Type": "application/json", } } } else { url = Add(url, Add("?", this.Rawencode(sortedQuery))) url = Add(url, Add("&sign=", signature)) } } } if IsTrue(IsEqual(method, "POST")) { var brokerId interface{} = this.SafeString(this.Options, "brokerId") if IsTrue(!IsEqual(brokerId, nil)) { AddElementToObject(headers, "Referer", brokerId) } } return map[string]interface{} { "url": url, "method": method, "body": body, "headers": headers, } } func (this *bybit) HandleErrors(httpCode interface{}, reason interface{}, url interface{}, method interface{}, headers interface{}, body interface{}, response interface{}, requestHeaders interface{}, requestBody interface{}) interface{} { if !IsTrue(response) { return nil // fallback to default error handler } // // { // "ret_code": 10001, // "ret_msg": "ReadMapCB: expect { or n, but found \u0000, error " + // "found in #0 byte of ...||..., bigger context " + // "...||...", // "ext_code": '', // "ext_info": '', // "result": null, // "time_now": "1583934106.590436" // } // // { // "retCode":10001, // "retMsg":"symbol params err", // "result":{"symbol":"","bid":"","bidIv":"","bidSize":"","ask":"","askIv":"","askSize":"","lastPrice":"","openInterest":"","indexPrice":"","markPrice":"","markPriceIv":"","change24h":"","high24h":"","low24h":"","volume24h":"","turnover24h":"","totalVolume":"","totalTurnover":"","fundingRate":"","predictedFundingRate":"","nextFundingTime":"","countdownHour":"0","predictedDeliveryPrice":"","underlyingPrice":"","delta":"","gamma":"","vega":"","theta":""} // } // var errorCode interface{} = this.SafeString2(response, "ret_code", "retCode") if IsTrue(!IsEqual(errorCode, "0")) { if IsTrue(IsEqual(errorCode, "30084")) { // not an error // https://github.com/ccxt/ccxt/issues/11268 // https://github.com/ccxt/ccxt/pull/11624 // POST https://api.bybit.com/v2/private/position/switch-isolated 200 OK // {"ret_code":30084,"ret_msg":"Isolated not modified","ext_code":"","ext_info":"","result":null,"time_now":"1642005219.937988","rate_limit_status":73,"rate_limit_reset_ms":1642005219894,"rate_limit":75} return nil } var feedback interface{} = nil if IsTrue(IsTrue(IsEqual(errorCode, "10005")) && IsTrue(IsLessThan(GetIndexOf(url, "order"), 0))) { feedback = Add(Add(this.Id, " private api uses /user/v3/private/query-api to check if you have a unified account. The API key of user id must own one of permissions: \"Account Transfer\", \"Subaccount Transfer\", \"Withdrawal\" "), body) } else { feedback = Add(Add(this.Id, " "), body) } if IsTrue(GetIndexOf(body, "Withdraw address chain or destination tag are not equal")) { feedback = Add(feedback, "; You might also need to ensure the address is whitelisted") } this.ThrowBroadlyMatchedException(GetValue(this.Exceptions, "broad"), body, feedback) this.ThrowExactlyMatchedException(GetValue(this.Exceptions, "exact"), errorCode, feedback) panic(ExchangeError(feedback)) } return nil } func (this *bybit) Init(userConfig map[string]interface{}) { this.Exchange = Exchange{} this.Exchange.InitParent(userConfig, this.Describe().(map[string]interface{}), this) this.Exchange.DerivedExchange = this }