ccxt-typescript by ccxt/ccxt
npx skills add https://github.com/ccxt/ccxt --skill ccxt-typescript一份关于在 TypeScript 和 JavaScript 项目中使用 CCXT 进行加密货币交易所集成的综合指南。
npm install ccxt
npm install ccxt
REST 和 WebSocket API 都包含在同一个包中。
import ccxt from 'ccxt'
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)
const ccxt = require('ccxt')
(async () => {
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)
})()
import ccxt from 'ccxt'
const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker) // 实时更新!
}
await exchange.close()
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 功能 | REST API | WebSocket API |
|---|---|---|
| 用途 | 一次性查询,下单 | 实时监控,实时价格推送 |
| 方法前缀 | fetch* (fetchTicker, fetchOrderBook) | watch* (watchTicker, watchOrderBook) |
| 速度 | 较慢(HTTP 请求/响应) | 较快(持久连接) |
| 速率限制 | 严格(1-2 次请求/秒) | 更宽松(连续流) |
| 导入 | ccxt.exchange() | ccxt.pro.exchange() |
| 最适合 | 交易,账户管理 | 价格监控,套利检测 |
何时使用 REST:
何时使用 WebSocket:
// 公共 API(无需认证)
const exchange = new ccxt.binance({
enableRateLimit: true // 推荐!
})
// 私有 API(带认证)
const exchange = new ccxt.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET',
enableRateLimit: true
})
// 公共 WebSocket
const exchange = new ccxt.pro.binance()
// 私有 WebSocket(带认证)
const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
// 完成后务必关闭
await exchange.close()
// 加载所有可用的交易对
await exchange.loadMarkets()
// 访问市场信息
const btcMarket = exchange.market('BTC/USDT')
console.log(btcMarket.limits.amount.min) // 最小订单数量
// 单个行情
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // 最新价格
console.log(ticker.bid) // 最佳买价
console.log(ticker.ask) // 最佳卖价
console.log(ticker.volume) // 24小时成交量
// 多个行情(如果支持)
const tickers = await exchange.fetchTickers(['BTC/USDT', 'ETH/USDT'])
// 完整订单簿
const orderbook = await exchange.fetchOrderBook('BTC/USDT')
console.log(orderbook.bids[0]) // [价格, 数量]
console.log(orderbook.asks[0]) // [价格, 数量]
// 有限深度
const orderbook = await exchange.fetchOrderBook('BTC/USDT', 5) // 前 5 档
// 限价买入订单
const order = await exchange.createLimitBuyOrder('BTC/USDT', 0.01, 50000)
console.log(order.id)
// 限价卖出订单
const order = await exchange.createLimitSellOrder('BTC/USDT', 0.01, 60000)
// 通用限价订单
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
// 市价买入订单
const order = await exchange.createMarketBuyOrder('BTC/USDT', 0.01)
// 市价卖出订单
const order = await exchange.createMarketSellOrder('BTC/USDT', 0.01)
// 通用市价订单
const order = await exchange.createOrder('BTC/USDT', 'market', 'sell', 0.01)
const balance = await exchange.fetchBalance()
console.log(balance.BTC.free) // 可用余额
console.log(balance.BTC.used) // 订单中占用的余额
console.log(balance.BTC.total) // 总余额
// 未成交订单
const openOrders = await exchange.fetchOpenOrders('BTC/USDT')
// 已成交订单
const closedOrders = await exchange.fetchClosedOrders('BTC/USDT')
// 所有订单(未成交 + 已成交)
const allOrders = await exchange.fetchOrders('BTC/USDT')
// 通过 ID 获取单个订单
const order = await exchange.fetchOrder(orderId, 'BTC/USDT')
// 最近的公共交易
const trades = await exchange.fetchTrades('BTC/USDT', undefined, 10)
// 您的交易(需要认证)
const myTrades = await exchange.fetchMyTrades('BTC/USDT')
// 取消单个订单
await exchange.cancelOrder(orderId, 'BTC/USDT')
// 取消某个交易对的所有订单
await exchange.cancelAllOrders('BTC/USDT')
const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker.last, ticker.timestamp)
}
await exchange.close()
const exchange = new ccxt.pro.binance()
while (true) {
const orderbook = await exchange.watchOrderBook('BTC/USDT')
console.log('最佳买价:', orderbook.bids[0])
console.log('最佳卖价:', orderbook.asks[0])
}
await exchange.close()
const exchange = new ccxt.pro.binance()
while (true) {
const trades = await exchange.watchTrades('BTC/USDT')
for (const trade of trades) {
console.log(trade.price, trade.amount, trade.side)
}
}
await exchange.close()
const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
while (true) {
const orders = await exchange.watchOrders('BTC/USDT')
for (const order of orders) {
console.log(order.id, order.status, order.filled)
}
}
await exchange.close()
const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
while (true) {
const balance = await exchange.watchBalance()
console.log('BTC:', balance.BTC)
console.log('USDT:', balance.USDT)
}
await exchange.close()
const exchange = new ccxt.pro.binance()
const symbols = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT']
while (true) {
// 并发监听所有交易对
const tickers = await exchange.watchTickers(symbols)
for (const symbol in tickers) {
console.log(symbol, tickers[symbol].last)
}
}
await exchange.close()
fetchTicker(symbol) - 获取单个交易对的行情fetchTickers([symbols]) - 一次性获取多个行情fetchBidsAsks([symbols]) - 获取多个交易对的最佳买/卖价fetchLastPrices([symbols]) - 获取最新价格fetchMarkPrices([symbols]) - 获取标记价格(衍生品)fetchOrderBook(symbol, limit) - 获取订单簿fetchOrderBooks([symbols]) - 获取多个订单簿fetchL2OrderBook(symbol) - 获取二级订单簿fetchL3OrderBook(symbol) - 获取三级订单簿(如果支持)fetchTrades(symbol, since, limit) - 获取公共交易记录fetchMyTrades(symbol, since, limit) - 获取您的交易记录(需要认证)fetchOrderTrades(orderId, symbol) - 获取特定订单的交易记录fetchOHLCV(symbol, timeframe, since, limit) - 获取K线数据fetchIndexOHLCV(symbol, timeframe) - 获取指数价格 OHLCVfetchMarkOHLCV(symbol, timeframe) - 获取标记价格 OHLCVfetchPremiumIndexOHLCV(symbol, timeframe) - 获取溢价指数 OHLCVfetchBalance() - 获取账户余额(需要认证)fetchAccounts() - 获取子账户fetchLedger(code, since, limit) - 获取账本历史fetchLedgerEntry(id, code) - 获取特定账本条目fetchTransactions(code, since, limit) - 获取交易记录fetchDeposits(code, since, limit) - 获取存款历史fetchWithdrawals(code, since, limit) - 获取提款历史fetchDepositsWithdrawals(code, since, limit) - 同时获取存款和提款记录createOrder(symbol, type, side, amount, price, params) - 创建订单(通用)createLimitOrder(symbol, side, amount, price) - 创建限价订单createMarketOrder(symbol, side, amount) - 创建市价订单createLimitBuyOrder(symbol, amount, price) - 限价买入订单createLimitSellOrder(symbol, amount, price) - 限价卖出订单createMarketBuyOrder(symbol, amount) - 市价买入订单createMarketSellOrder(symbol, amount) - 市价卖出订单createMarketBuyOrderWithCost(symbol, cost) - 按指定成本买入createStopLimitOrder(symbol, side, amount, price, stopPrice) - 止损限价订单createStopMarketOrder(symbol, side, amount, stopPrice) - 止损市价订单createStopLossOrder(symbol, side, amount, stopPrice) - 止损订单createTakeProfitOrder(symbol, side, amount, takeProfitPrice) - 止盈订单createTrailingAmountOrder(symbol, side, amount, trailingAmount) - 追踪止损(金额)createTrailingPercentOrder(symbol, side, amount, trailingPercent) - 追踪止损(百分比)createTriggerOrder(symbol, side, amount, triggerPrice) - 触发订单createPostOnlyOrder(symbol, side, amount, price) - 仅限挂单订单createReduceOnlyOrder(symbol, side, amount, price) - 仅限减仓订单createOrders([orders]) - 一次性创建多个订单createOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice) - OCO 订单fetchOrder(orderId, symbol) - 获取单个订单fetchOrders(symbol, since, limit) - 获取所有订单fetchOpenOrders(symbol, since, limit) - 获取未成交订单fetchClosedOrders(symbol, since, limit) - 获取已成交订单fetchCanceledOrders(symbol, since, limit) - 获取已取消订单fetchOpenOrder(orderId, symbol) - 获取特定的未成交订单fetchOrdersByStatus(status, symbol) - 按状态获取订单cancelOrder(orderId, symbol) - 取消单个订单cancelOrders([orderIds], symbol) - 取消多个订单cancelAllOrders(symbol) - 取消某个交易对的所有订单editOrder(orderId, symbol, type, side, amount, price) - 修改订单fetchBorrowRate(code) - 获取保证金借款利率fetchBorrowRates([codes]) - 获取多个借款利率fetchBorrowRateHistory(code, since, limit) - 历史借款利率fetchCrossBorrowRate(code) - 全仓保证金借款利率fetchIsolatedBorrowRate(symbol, code) - 逐仓保证金借款利率borrowMargin(code, amount, symbol) - 借入保证金repayMargin(code, amount, symbol) - 偿还保证金fetchLeverage(symbol) - 获取杠杆setLeverage(leverage, symbol) - 设置杠杆fetchLeverageTiers(symbols) - 获取杠杆层级fetchMarketLeverageTiers(symbol) - 市场的杠杆层级setMarginMode(marginMode, symbol) - 设置保证金模式(全仓/逐仓)fetchMarginMode(symbol) - 获取保证金模式fetchPosition(symbol) - 获取单个持仓fetchPositions([symbols]) - 获取所有持仓fetchPositionsForSymbol(symbol) - 获取某个交易对的持仓fetchPositionHistory(symbol, since, limit) - 持仓历史fetchPositionsHistory(symbols, since, limit) - 多个持仓历史fetchPositionMode(symbol) - 获取持仓模式(单向/对冲)setPositionMode(hedged, symbol) - 设置持仓模式closePosition(symbol, side) - 平仓closeAllPositions() - 平掉所有仓位fetchFundingRate(symbol) - 当前资金费率fetchFundingRates([symbols]) - 多个资金费率fetchFundingRateHistory(symbol, since, limit) - 资金费率历史fetchFundingHistory(symbol, since, limit) - 您的资金费支付记录fetchFundingInterval(symbol) - 资金费间隔fetchSettlementHistory(symbol, since, limit) - 结算历史fetchMySettlementHistory(symbol, since, limit) - 您的结算历史fetchOpenInterest(symbol) - 交易对的未平仓合约fetchOpenInterests([symbols]) - 多个未平仓合约fetchOpenInterestHistory(symbol, timeframe, since, limit) - 未平仓合约历史fetchLiquidations(symbol, since, limit) - 公共强平记录fetchMyLiquidations(symbol, since, limit) - 您的强平记录fetchOption(symbol) - 获取期权信息fetchOptionChain(code) - 获取期权链fetchGreeks(symbol) - 获取期权希腊值fetchVolatilityHistory(code, since, limit) - 波动率历史fetchUnderlyingAssets() - 获取标的资产fetchTradingFee(symbol) - 交易对的交易手续费fetchTradingFees([symbols]) - 多个交易对的交易手续费fetchTradingLimits([symbols]) - 交易限制fetchTransactionFee(code) - 交易/提款手续费fetchTransactionFees([codes]) - 多个交易手续费fetchDepositWithdrawFee(code) - 存款/提款手续费fetchDepositWithdrawFees([codes]) - 多个存款/提款手续费fetchDepositAddress(code, params) - 获取存款地址fetchDepositAddresses([codes]) - 多个存款地址fetchDepositAddressesByNetwork(code) - 按网络分类的地址createDepositAddress(code, params) - 创建新的存款地址fetchDeposit(id, code) - 获取单笔存款记录fetchWithdrawal(id, code) - 获取单笔提款记录fetchWithdrawAddresses(code) - 获取提款地址fetchWithdrawalWhitelist(code) - 获取白名单withdraw(code, amount, address, tag, params) - 提款资金deposit(code, amount, params) - 存款资金(如果支持)transfer(code, amount, fromAccount, toAccount) - 内部转账fetchTransfer(id, code) - 获取转账信息fetchTransfers(code, since, limit) - 获取转账历史fetchConvertCurrencies() - 可兑换的货币fetchConvertQuote(fromCode, toCode, amount) - 获取兑换报价createConvertTrade(fromCode, toCode, amount) - 执行兑换fetchConvertTrade(id) - 获取兑换交易记录fetchConvertTradeHistory(code, since, limit) - 兑换历史fetchMarkets() - 获取所有市场fetchCurrencies() - 获取所有货币fetchTime() - 获取交易所服务器时间fetchStatus() - 获取交易所状态fetchBorrowInterest(code, symbol, since, limit) - 已支付的借款利息fetchLongShortRatio(symbol, timeframe, since, limit) - 多空比率fetchLongShortRatioHistory(symbol, timeframe, since, limit) - 多空比率历史所有 REST 方法都有对应的 WebSocket 版本,使用 watch* 前缀:
watchTicker(symbol) - 监听单个行情watchTickers([symbols]) - 监听多个行情watchOrderBook(symbol) - 监听订单簿更新watchOrderBookForSymbols([symbols]) - 监听多个订单簿watchTrades(symbol) - 监听公共交易watchOHLCV(symbol, timeframe) - 监听K线更新watchBidsAsks([symbols]) - 监听最佳买/卖价watchBalance() - 监听余额更新watchOrders(symbol) - 监听您的订单更新watchMyTrades(symbol) - 监听您的交易更新watchPositions([symbols]) - 监听持仓更新watchPositionsForSymbol(symbol) - 监听特定交易对的持仓标记为 🔒 的方法需要 API 凭据:
create* 方法(创建订单、地址)cancel* 方法(取消订单)edit* 方法(修改订单)fetchMy* 方法(您的交易、订单)fetchBalance, fetchLedger, fetchAccountswithdraw, transfer, depositwatchBalance, watchOrders, watchMyTrades, watchPositions并非所有交易所都支持所有方法。使用前请检查:
// 检查方法是否受支持
if (exchange.has['fetchOHLCV']) {
const candles = await exchange.fetchOHLCV('BTC/USDT', '1h')
}
// 检查多项功能
console.log(exchange.has)
// {
// fetchTicker: true,
// fetchOHLCV: true,
// fetchMyTrades: true,
// fetchPositions: false,
// ...
// }
fetch* - REST API 方法(HTTP 请求)watch* - WebSocket 方法(实时流)create* - 创建新资源(订单、地址)cancel* - 取消现有资源edit* - 修改现有资源set* - 配置设置(杠杆、保证金模式)*Ws 后缀 - WebSocket 变体(某些交易所)CCXT 支持 HTTP、HTTPS 和 SOCKS 代理,适用于 REST 和 WebSocket 连接。
// HTTP 代理
exchange.httpProxy = 'http://your-proxy-host:port'
// HTTPS 代理
exchange.httpsProxy = 'https://your-proxy-host:port'
// SOCKS 代理
exchange.socksProxy = 'socks://your-proxy-host:port'
// 带认证的代理
exchange.httpProxy = 'http://user:pass@proxy-host:port'
WebSocket 连接同样遵循代理设置:
exchange.httpsProxy = 'https://proxy:8080'
// WebSocket 连接将使用此代理
exchange.httpProxy = 'http://localhost:8080'
try {
await exchange.fetchTicker('BTC/USDT')
console.log('代理工作正常!')
} catch (error) {
console.error('代理连接失败:', error)
}
一些交易所提供了 REST 方法的 WebSocket 变体,用于更快的下单和管理。这些方法使用 *Ws 后缀:
创建订单:
createOrderWs - 通过 WebSocket 创建订单(比 REST 更快)createLimitOrderWs - 通过 WebSocket 创建限价订单createMarketOrderWs - 通过 WebSocket 创建市价订单createLimitBuyOrderWs - 通过 WebSocket 买入限价订单createLimitSellOrderWs - 通过 WebSocket 卖出限价订单createMarketBuyOrderWs - 通过 WebSocket 买入市价订单createMarketSellOrderWs - 通过 WebSocket 卖出市价订单createStopLimitOrderWs - 通过 WebSocket 止损限价订单createStopMarketOrderWs - 通过 WebSocket 止损市价订单createStopLossOrderWs - 通过 WebSocket 止损订单createTakeProfitOrderWs - 通过 WebSocket 止盈订单createTrailingAmountOrderWs - 通过 WebSocket 追踪止损(金额)createTrailingPercentOrderWs - 通过 WebSocket 追踪止损(百分比)createPostOnlyOrderWs - 通过 WebSocket 仅限挂单订单createReduceOnlyOrderWs - 通过 WebSocket 仅限减仓订单管理订单:
editOrderWs - 通过 WebSocket 修改订单cancelOrderWs - 通过 WebSocket 取消订单(比 REST 更快)cancelOrdersWs - 通过 WebSocket 取消多个订单cancelAllOrdersWs - 通过 WebSocket 取消所有订单获取数据:
fetchOrderWs - 通过 WebSocket 获取订单fetchOrdersWs - 通过 WebSocket 获取订单fetchOpenOrdersWs - 通过 WebSocket 获取未成交订单fetchClosedOrdersWs - 通过 WebSocket 获取已成交订单fetchMyTradesWs - 通过 WebSocket 获取您的交易记录fetchBalanceWs - 通过 WebSocket 获取余额fetchPositionWs - 通过 WebSocket 获取持仓fetchPositionsWs - 通过 WebSocket 获取所有持仓fetchPositionsForSymbolWs - 通过 WebSocket 获取特定交易对的持仓fetchTradingFeesWs - 通过 WebSocket 获取交易手续费在以下情况使用 *Ws 方法:
在以下情况使用 REST 方法:
REST API(较慢,更可靠):
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
WebSocket API(较快,延迟更低):
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
并非所有交易所都支持 WebSocket 交易方法:
if (exchange.has['createOrderWs']) {
// 交易所支持 WebSocket 下单
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
} else {
// 回退到 REST
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
}
// 在实例化期间
const exchange = new ccxt.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET',
enableRateLimit: true
})
// 实例化之后
exchange.apiKey = 'YOUR_API_KEY'
exchange.secret = 'YOUR_SECRET'
const exchange = new ccxt.binance({
apiKey: process.env.BINANCE_API_KEY,
secret: process.env.BINANCE_SECRET,
enableRateLimit: true
})
try {
const balance = await exchange.fetchBalance()
console.log('认证成功!')
} catch (error) {
if (error instanceof ccxt.AuthenticationError) {
console.error('API 凭据无效')
}
}
BaseError
├─ NetworkError (可恢复 - 重试)
│ ├─ RequestTimeout
│ ├─ ExchangeNotAvailable
│ ├─ RateLimitExceeded
│ └─ DDoSProtection
└─ ExchangeError (不可恢复 - 不要重试)
├─ AuthenticationError
├─ InsufficientFunds
├─ InvalidOrder
└─ NotSupported
import ccxt from 'ccxt'
try {
const ticker = await exchange.fetchTicker('BTC/USDT')
} catch (error) {
if (error instanceof ccxt.NetworkError) {
console.error('网络错误 - 重试:', error.message)
} else if (error instanceof ccxt.ExchangeError) {
console.error('交易所错误 - 不要重试:', error.message)
} else {
console.error('未知错误:', error)
}
}
try {
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
} catch (error) {
if (error instanceof ccxt.InsufficientFunds) {
console.error('余额不足')
} else if (error instanceof ccxt.InvalidOrder) {
console.error('订单参数无效')
} else if (error instanceof ccxt.RateLimitExceeded) {
console.error('达到速率限制 - 重试前等待')
await exchange.sleep(1000) // 等待 1 秒
} else if (error instanceof ccxt.AuthenticationError) {
console.error('检查您的 API 凭据')
}
}
async function fetchWithRetry(maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await exchange.fetchTicker('BTC/USDT')
} catch (error) {
if (error instanceof ccxt.NetworkError && i < maxRetries - 1) {
console.log(`重试 ${i + 1}/${maxRetries}`)
await exchange.sleep(1000 * (i + 1)) // 指数退避
} else {
throw error
}
}
}
}
const exchange = new ccxt.binance({
enableRateLimit: true // 自动限制请求频率
})
await exchange.fetchTicker('BTC/USDT')
await exchange.sleep(1000) // 等待 1 秒
await exchange.fetchTicker('ETH/USDT')
console.log(exchange.rateLimit) // 请求间隔(毫秒)
await// 错误 - 返回 Promise,而不是数据
const ticker = exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // 错误:ticker 是一个 Promise!
// 正确
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // 正常工作!
// 错误 - 浪费速率限制,速度慢
while (true) {
const ticker = await exchange.fetchTicker('BTC/USDT') // REST
console.log(ticker.last)
await exchange.sleep(1000)
}
// 正确 - 使用 WebSocket
const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT') // WebSocket
console.log(ticker.last)
}
// 错误 - 内存泄漏
const exchange = new ccxt.pro.binance()
const ticker = await exchange.watchTicker('BTC/USDT')
// 忘记关闭!
// 正确
const exchange = new ccxt.pro.binance()
try {
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker)
}
} finally {
await exchange.close()
}
// 错误 - nonce 冲突
const ex1 = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
const ex2 = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
await ex1.fetchBalance()
await ex2.fetchBalance() // 可能因 nonce 问题而失败!
// 正确 - 重用单个实例
const exchange = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
await exchange.fetchBalance()
await exchange.fetchBalance()
// 错误 - 可能触发速率限制
const exchange = new ccxt.binance()
for (let i = 0; i < 100; i++) {
await exchange.fetchTicker('BTC/USDT') // 可能失败!
}
// 正确
const exchange = new ccxt.binance({ enableRateLimit: true })
for (let i = 0; i < 100; i++) {
await exchange.fetchTicker('BTC/USDT') // 自动限制频率
}
<script src="https://cdn.jsdelivr.net/npm/ccxt@latest/dist/ccxt.browser.js"></script>
<script>
const exchange = new ccxt.binance()
exchange.loadMarkets().then(() => {
return exchange.fetchTicker('BTC/USDT')
}).then(ticker => {
console.log(ticker)
})
</script>
import ccxt from 'https://cdn.jsdelivr.net/npm/ccxt@latest/dist/ccxt.browser.js'
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)
1. "Cannot find module 'ccxt'"
npm install ccxt2. "RateLimitExceeded"
enableRateLimit: true3. "AuthenticationError"
4. "InvalidNonce"
5. "InsufficientFunds"
balance.BTC.free)6. "ExchangeNotAvailable"
A comprehensive guide to using CCXT in TypeScript and JavaScript projects for cryptocurrency exchange integration.
npm install ccxt
npm install ccxt
Both REST and WebSocket APIs are included in the same package.
import ccxt from 'ccxt'
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)
const ccxt = require('ccxt')
(async () => {
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)
})()
import ccxt from 'ccxt'
const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker) // Live updates!
}
await exchange.close()
| Feature | REST API | WebSocket API |
|---|---|---|
| Use for | One-time queries, placing orders | Real-time monitoring, live price feeds |
| Method prefix | fetch* (fetchTicker, fetchOrderBook) | watch* (watchTicker, watchOrderBook) |
| Speed | Slower (HTTP request/response) | Faster (persistent connection) |
| Rate limits | Strict (1-2 req/sec) | More lenient (continuous stream) |
| Import | ccxt.exchange() | ccxt.pro.exchange() |
When to use REST:
When to use WebSocket:
// Public API (no authentication)
const exchange = new ccxt.binance({
enableRateLimit: true // Recommended!
})
// Private API (with authentication)
const exchange = new ccxt.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET',
enableRateLimit: true
})
// Public WebSocket
const exchange = new ccxt.pro.binance()
// Private WebSocket (with authentication)
const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
// Always close when done
await exchange.close()
// Load all available trading pairs
await exchange.loadMarkets()
// Access market information
const btcMarket = exchange.market('BTC/USDT')
console.log(btcMarket.limits.amount.min) // Minimum order amount
// Single ticker
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // Last price
console.log(ticker.bid) // Best bid
console.log(ticker.ask) // Best ask
console.log(ticker.volume) // 24h volume
// Multiple tickers (if supported)
const tickers = await exchange.fetchTickers(['BTC/USDT', 'ETH/USDT'])
// Full orderbook
const orderbook = await exchange.fetchOrderBook('BTC/USDT')
console.log(orderbook.bids[0]) // [price, amount]
console.log(orderbook.asks[0]) // [price, amount]
// Limited depth
const orderbook = await exchange.fetchOrderBook('BTC/USDT', 5) // Top 5 levels
// Buy limit order
const order = await exchange.createLimitBuyOrder('BTC/USDT', 0.01, 50000)
console.log(order.id)
// Sell limit order
const order = await exchange.createLimitSellOrder('BTC/USDT', 0.01, 60000)
// Generic limit order
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
// Buy market order
const order = await exchange.createMarketBuyOrder('BTC/USDT', 0.01)
// Sell market order
const order = await exchange.createMarketSellOrder('BTC/USDT', 0.01)
// Generic market order
const order = await exchange.createOrder('BTC/USDT', 'market', 'sell', 0.01)
const balance = await exchange.fetchBalance()
console.log(balance.BTC.free) // Available balance
console.log(balance.BTC.used) // Balance in orders
console.log(balance.BTC.total) // Total balance
// Open orders
const openOrders = await exchange.fetchOpenOrders('BTC/USDT')
// Closed orders
const closedOrders = await exchange.fetchClosedOrders('BTC/USDT')
// All orders (open + closed)
const allOrders = await exchange.fetchOrders('BTC/USDT')
// Single order by ID
const order = await exchange.fetchOrder(orderId, 'BTC/USDT')
// Recent public trades
const trades = await exchange.fetchTrades('BTC/USDT', undefined, 10)
// Your trades (requires authentication)
const myTrades = await exchange.fetchMyTrades('BTC/USDT')
// Cancel single order
await exchange.cancelOrder(orderId, 'BTC/USDT')
// Cancel all orders for a symbol
await exchange.cancelAllOrders('BTC/USDT')
const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker.last, ticker.timestamp)
}
await exchange.close()
const exchange = new ccxt.pro.binance()
while (true) {
const orderbook = await exchange.watchOrderBook('BTC/USDT')
console.log('Best bid:', orderbook.bids[0])
console.log('Best ask:', orderbook.asks[0])
}
await exchange.close()
const exchange = new ccxt.pro.binance()
while (true) {
const trades = await exchange.watchTrades('BTC/USDT')
for (const trade of trades) {
console.log(trade.price, trade.amount, trade.side)
}
}
await exchange.close()
const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
while (true) {
const orders = await exchange.watchOrders('BTC/USDT')
for (const order of orders) {
console.log(order.id, order.status, order.filled)
}
}
await exchange.close()
const exchange = new ccxt.pro.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET'
})
while (true) {
const balance = await exchange.watchBalance()
console.log('BTC:', balance.BTC)
console.log('USDT:', balance.USDT)
}
await exchange.close()
const exchange = new ccxt.pro.binance()
const symbols = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT']
while (true) {
// Watch all symbols concurrently
const tickers = await exchange.watchTickers(symbols)
for (const symbol in tickers) {
console.log(symbol, tickers[symbol].last)
}
}
await exchange.close()
fetchTicker(symbol) - Fetch ticker for one symbolfetchTickers([symbols]) - Fetch multiple tickers at oncefetchBidsAsks([symbols]) - Fetch best bid/ask for multiple symbolsfetchLastPrices([symbols]) - Fetch last pricesfetchMarkPrices([symbols]) - Fetch mark prices (derivatives)fetchOrderBook(symbol, limit) - Fetch order bookfetchOrderBooks([symbols]) - Fetch multiple order booksfetchL2OrderBook(symbol) - Fetch level 2 order bookfetchL3OrderBook(symbol) - Fetch level 3 order book (if supported)fetchTrades(symbol, since, limit) - Fetch public tradesfetchMyTrades(symbol, since, limit) - Fetch your trades (auth required)fetchOrderTrades(orderId, symbol) - Fetch trades for specific orderfetchOHLCV(symbol, timeframe, since, limit) - Fetch candlestick datafetchIndexOHLCV(symbol, timeframe) - Fetch index price OHLCVfetchMarkOHLCV(symbol, timeframe) - Fetch mark price OHLCVfetchPremiumIndexOHLCV(symbol, timeframe) - Fetch premium index OHLCVfetchBalance() - Fetch account balance (auth required)fetchAccounts() - Fetch sub-accountsfetchLedger(code, since, limit) - Fetch ledger historyfetchLedgerEntry(id, code) - Fetch specific ledger entryfetchTransactions(code, since, limit) - Fetch transactionsfetchDeposits(code, since, limit) - Fetch deposit historyfetchWithdrawals(code, since, limit) - Fetch withdrawal historyfetchDepositsWithdrawals(code, since, limit) - Fetch both deposits and withdrawalscreateOrder(symbol, type, side, amount, price, params) - Create order (generic)createLimitOrder(symbol, side, amount, price) - Create limit ordercreateMarketOrder(symbol, side, amount) - Create market ordercreateLimitBuyOrder(symbol, amount, price) - Buy limit ordercreateLimitSellOrder(symbol, amount, price) - Sell limit ordercreateMarketBuyOrder(symbol, amount) - Buy market ordercreateMarketSellOrder(symbol, amount) - Sell market ordercreateMarketBuyOrderWithCost(symbol, cost) - Buy with specific costfetchOrder(orderId, symbol) - Fetch single orderfetchOrders(symbol, since, limit) - Fetch all ordersfetchOpenOrders(symbol, since, limit) - Fetch open ordersfetchClosedOrders(symbol, since, limit) - Fetch closed ordersfetchCanceledOrders(symbol, since, limit) - Fetch canceled ordersfetchOpenOrder(orderId, symbol) - Fetch specific open orderfetchOrdersByStatus(status, symbol) - Fetch orders by statuscancelOrder(orderId, symbol) - Cancel single ordercancelOrders([orderIds], symbol) - Cancel multiple ordersfetchBorrowRate(code) - Fetch borrow rate for marginfetchBorrowRates([codes]) - Fetch multiple borrow ratesfetchBorrowRateHistory(code, since, limit) - Historical borrow ratesfetchCrossBorrowRate(code) - Cross margin borrow ratefetchIsolatedBorrowRate(symbol, code) - Isolated margin borrow rateborrowMargin(code, amount, symbol) - Borrow marginrepayMargin(code, amount, symbol) - Repay marginfetchLeverage(symbol) - Fetch leveragesetLeverage(leverage, symbol) - Set leveragefetchPosition(symbol) - Fetch single positionfetchPositions([symbols]) - Fetch all positionsfetchPositionsForSymbol(symbol) - Fetch positions for symbolfetchPositionHistory(symbol, since, limit) - Position historyfetchPositionsHistory(symbols, since, limit) - Multiple position historyfetchPositionMode(symbol) - Fetch position mode (one-way/hedge)setPositionMode(hedged, symbol) - Set position modeclosePosition(symbol, side) - Close positioncloseAllPositions() - Close all positionsfetchFundingRate(symbol) - Current funding ratefetchFundingRates([symbols]) - Multiple funding ratesfetchFundingRateHistory(symbol, since, limit) - Funding rate historyfetchFundingHistory(symbol, since, limit) - Your funding paymentsfetchFundingInterval(symbol) - Funding intervalfetchSettlementHistory(symbol, since, limit) - Settlement historyfetchMySettlementHistory(symbol, since, limit) - Your settlement historyfetchOpenInterest(symbol) - Open interest for symbolfetchOpenInterests([symbols]) - Multiple open interestsfetchOpenInterestHistory(symbol, timeframe, since, limit) - OI historyfetchLiquidations(symbol, since, limit) - Public liquidationsfetchMyLiquidations(symbol, since, limit) - Your liquidationsfetchOption(symbol) - Fetch option infofetchOptionChain(code) - Fetch option chainfetchGreeks(symbol) - Fetch option greeksfetchVolatilityHistory(code, since, limit) - Volatility historyfetchUnderlyingAssets() - Fetch underlying assetsfetchTradingFee(symbol) - Trading fee for symbolfetchTradingFees([symbols]) - Trading fees for multiple symbolsfetchTradingLimits([symbols]) - Trading limitsfetchTransactionFee(code) - Transaction/withdrawal feefetchTransactionFees([codes]) - Multiple transaction feesfetchDepositWithdrawFee(code) - Deposit/withdrawal feefetchDepositWithdrawFees([codes]) - Multiple deposit/withdraw feesfetchDepositAddress(code, params) - Get deposit addressfetchDepositAddresses([codes]) - Multiple deposit addressesfetchDepositAddressesByNetwork(code) - Addresses by networkcreateDepositAddress(code, params) - Create new deposit addressfetchDeposit(id, code) - Fetch single depositfetchWithdrawal(id, code) - Fetch single withdrawalfetchWithdrawAddresses(code) - Fetch withdrawal addressesfetchWithdrawalWhitelist(code) - Fetch whitelistwithdraw(code, amount, address, tag, params) - Withdraw fundstransfer(code, amount, fromAccount, toAccount) - Internal transferfetchTransfer(id, code) - Fetch transfer infofetchTransfers(code, since, limit) - Fetch transfer historyfetchConvertCurrencies() - Currencies available for convertfetchConvertQuote(fromCode, toCode, amount) - Get conversion quotecreateConvertTrade(fromCode, toCode, amount) - Execute conversionfetchConvertTrade(id) - Fetch convert tradefetchConvertTradeHistory(code, since, limit) - Convert historyfetchMarkets() - Fetch all marketsfetchCurrencies() - Fetch all currenciesfetchTime() - Fetch exchange server timefetchStatus() - Fetch exchange statusfetchBorrowInterest(code, symbol, since, limit) - Borrow interest paidfetchLongShortRatio(symbol, timeframe, since, limit) - Long/short ratiofetchLongShortRatioHistory(symbol, timeframe, since, limit) - L/S ratio historyAll REST methods have WebSocket equivalents with watch* prefix:
watchTicker(symbol) - Watch single tickerwatchTickers([symbols]) - Watch multiple tickerswatchOrderBook(symbol) - Watch order book updateswatchOrderBookForSymbols([symbols]) - Watch multiple order bookswatchTrades(symbol) - Watch public tradeswatchOHLCV(symbol, timeframe) - Watch candlestick updateswatchBidsAsks([symbols]) - Watch best bid/askwatchBalance() - Watch balance updateswatchOrders(symbol) - Watch your order updateswatchMyTrades(symbol) - Watch your trade updateswatchPositions([symbols]) - Watch position updateswatchPositionsForSymbol(symbol) - Watch positions for symbolMethods marked with 🔒 require API credentials:
create* methods (creating orders, addresses)cancel* methods (canceling orders)edit* methods (modifying orders)fetchMy* methods (your trades, orders)fetchBalance, fetchLedger, fetchAccountswithdraw, transfer, depositNot all exchanges support all methods. Check before using:
// Check if method is supported
if (exchange.has['fetchOHLCV']) {
const candles = await exchange.fetchOHLCV('BTC/USDT', '1h')
}
// Check multiple capabilities
console.log(exchange.has)
// {
// fetchTicker: true,
// fetchOHLCV: true,
// fetchMyTrades: true,
// fetchPositions: false,
// ...
// }
fetch* - REST API methods (HTTP requests)watch* - WebSocket methods (real-time streams)create* - Create new resources (orders, addresses)cancel* - Cancel existing resourcesedit* - Modify existing resourcesset* - Configure settings (leverage, margin mode)*Ws suffix - WebSocket variant (some exchanges)CCXT supports HTTP, HTTPS, and SOCKS proxies for both REST and WebSocket connections.
// HTTP Proxy
exchange.httpProxy = 'http://your-proxy-host:port'
// HTTPS Proxy
exchange.httpsProxy = 'https://your-proxy-host:port'
// SOCKS Proxy
exchange.socksProxy = 'socks://your-proxy-host:port'
// Proxy with authentication
exchange.httpProxy = 'http://user:pass@proxy-host:port'
WebSocket connections also respect proxy settings:
exchange.httpsProxy = 'https://proxy:8080'
// WebSocket connections will use this proxy
exchange.httpProxy = 'http://localhost:8080'
try {
await exchange.fetchTicker('BTC/USDT')
console.log('Proxy working!')
} catch (error) {
console.error('Proxy connection failed:', error)
}
Some exchanges provide WebSocket variants of REST methods for faster order placement and management. These use the *Ws suffix:
Creating Orders:
createOrderWs - Create order via WebSocket (faster than REST)createLimitOrderWs - Create limit order via WebSocketcreateMarketOrderWs - Create market order via WebSocketcreateLimitBuyOrderWs - Buy limit order via WebSocketcreateLimitSellOrderWs - Sell limit order via WebSocketcreateMarketBuyOrderWs - Buy market order via WebSocketcreateMarketSellOrderWs - Sell market order via WebSocketcreateStopLimitOrderWs - Stop-limit order via WebSocketcreateStopMarketOrderWs - Stop-market order via WebSocketManaging Orders:
editOrderWs - Edit order via WebSocketcancelOrderWs - Cancel order via WebSocket (faster than REST)cancelOrdersWs - Cancel multiple orders via WebSocketcancelAllOrdersWs - Cancel all orders via WebSocketFetching Data:
fetchOrderWs - Fetch order via WebSocketfetchOrdersWs - Fetch orders via WebSocketfetchOpenOrdersWs - Fetch open orders via WebSocketfetchClosedOrdersWs - Fetch closed orders via WebSocketfetchMyTradesWs - Fetch your trades via WebSocketfetchBalanceWs - Fetch balance via WebSocketfetchPositionWs - Fetch position via WebSocketfetchPositionsWs - Fetch positions via WebSocketfetchPositionsForSymbolWs - Fetch positions for symbol via WebSocketUse*Ws methods when:
Use REST methods when:
REST API (slower, more reliable):
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
WebSocket API (faster, lower latency):
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
Not all exchanges support WebSocket trading methods:
if (exchange.has['createOrderWs']) {
// Exchange supports WebSocket order creation
const order = await exchange.createOrderWs('BTC/USDT', 'limit', 'buy', 0.01, 50000)
} else {
// Fall back to REST
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
}
// During instantiation
const exchange = new ccxt.binance({
apiKey: 'YOUR_API_KEY',
secret: 'YOUR_SECRET',
enableRateLimit: true
})
// After instantiation
exchange.apiKey = 'YOUR_API_KEY'
exchange.secret = 'YOUR_SECRET'
const exchange = new ccxt.binance({
apiKey: process.env.BINANCE_API_KEY,
secret: process.env.BINANCE_SECRET,
enableRateLimit: true
})
try {
const balance = await exchange.fetchBalance()
console.log('Authentication successful!')
} catch (error) {
if (error instanceof ccxt.AuthenticationError) {
console.error('Invalid API credentials')
}
}
BaseError
├─ NetworkError (recoverable - retry)
│ ├─ RequestTimeout
│ ├─ ExchangeNotAvailable
│ ├─ RateLimitExceeded
│ └─ DDoSProtection
└─ ExchangeError (non-recoverable - don't retry)
├─ AuthenticationError
├─ InsufficientFunds
├─ InvalidOrder
└─ NotSupported
import ccxt from 'ccxt'
try {
const ticker = await exchange.fetchTicker('BTC/USDT')
} catch (error) {
if (error instanceof ccxt.NetworkError) {
console.error('Network error - retry:', error.message)
} else if (error instanceof ccxt.ExchangeError) {
console.error('Exchange error - do not retry:', error.message)
} else {
console.error('Unknown error:', error)
}
}
try {
const order = await exchange.createOrder('BTC/USDT', 'limit', 'buy', 0.01, 50000)
} catch (error) {
if (error instanceof ccxt.InsufficientFunds) {
console.error('Not enough balance')
} else if (error instanceof ccxt.InvalidOrder) {
console.error('Invalid order parameters')
} else if (error instanceof ccxt.RateLimitExceeded) {
console.error('Rate limit hit - wait before retrying')
await exchange.sleep(1000) // Wait 1 second
} else if (error instanceof ccxt.AuthenticationError) {
console.error('Check your API credentials')
}
}
async function fetchWithRetry(maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await exchange.fetchTicker('BTC/USDT')
} catch (error) {
if (error instanceof ccxt.NetworkError && i < maxRetries - 1) {
console.log(`Retry ${i + 1}/${maxRetries}`)
await exchange.sleep(1000 * (i + 1)) // Exponential backoff
} else {
throw error
}
}
}
}
const exchange = new ccxt.binance({
enableRateLimit: true // Automatically throttles requests
})
await exchange.fetchTicker('BTC/USDT')
await exchange.sleep(1000) // Wait 1 second
await exchange.fetchTicker('ETH/USDT')
console.log(exchange.rateLimit) // Milliseconds between requests
await// Wrong - returns Promise, not data
const ticker = exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // ERROR: ticker is a Promise!
// Correct
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker.last) // Works!
// Wrong - wastes rate limits, slow
while (true) {
const ticker = await exchange.fetchTicker('BTC/USDT') // REST
console.log(ticker.last)
await exchange.sleep(1000)
}
// Correct - use WebSocket
const exchange = new ccxt.pro.binance()
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT') // WebSocket
console.log(ticker.last)
}
// Wrong - memory leak
const exchange = new ccxt.pro.binance()
const ticker = await exchange.watchTicker('BTC/USDT')
// Forgot to close!
// Correct
const exchange = new ccxt.pro.binance()
try {
while (true) {
const ticker = await exchange.watchTicker('BTC/USDT')
console.log(ticker)
}
} finally {
await exchange.close()
}
// Wrong - nonce conflicts
const ex1 = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
const ex2 = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
await ex1.fetchBalance()
await ex2.fetchBalance() // May fail due to nonce issues!
// Correct - reuse single instance
const exchange = new ccxt.binance({ apiKey: 'key', secret: 'secret' })
await exchange.fetchBalance()
await exchange.fetchBalance()
// Wrong - may hit rate limits
const exchange = new ccxt.binance()
for (let i = 0; i < 100; i++) {
await exchange.fetchTicker('BTC/USDT') // May fail!
}
// Correct
const exchange = new ccxt.binance({ enableRateLimit: true })
for (let i = 0; i < 100; i++) {
await exchange.fetchTicker('BTC/USDT') // Automatically throttled
}
<script src="https://cdn.jsdelivr.net/npm/ccxt@latest/dist/ccxt.browser.js"></script>
<script>
const exchange = new ccxt.binance()
exchange.loadMarkets().then(() => {
return exchange.fetchTicker('BTC/USDT')
}).then(ticker => {
console.log(ticker)
})
</script>
import ccxt from 'https://cdn.jsdelivr.net/npm/ccxt@latest/dist/ccxt.browser.js'
const exchange = new ccxt.binance()
await exchange.loadMarkets()
const ticker = await exchange.fetchTicker('BTC/USDT')
console.log(ticker)
1. "Cannot find module 'ccxt'"
npm install ccxt2. "RateLimitExceeded"
enableRateLimit: true3. "AuthenticationError"
4. "InvalidNonce"
5. "InsufficientFunds"
balance.BTC.free)6. "ExchangeNotAvailable"
7. WebSocket connection drops
watch* methods// Enable verbose logging
exchange.verbose = true
// Check exchange capabilities
console.log(exchange.has)
// {
// fetchTicker: true,
// fetchOrderBook: true,
// createOrder: true,
// ...
// }
// Check market information
console.log(exchange.markets['BTC/USDT'])
// Check last request/response
console.log(exchange.last_http_response)
console.log(exchange.last_json_response)
Weekly Installs
65
Repository
GitHub Stars
41.3K
First Seen
Feb 4, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode62
codex60
gemini-cli60
github-copilot59
kimi-cli55
amp55
lark-cli 共享规则:飞书资源操作指南与权限配置详解
39,000 周安装
| Best for | Trading, account management | Price monitoring, arbitrage detection |
createStopLimitOrder(symbol, side, amount, price, stopPrice) - Stop-limit ordercreateStopMarketOrder(symbol, side, amount, stopPrice) - Stop-market ordercreateStopLossOrder(symbol, side, amount, stopPrice) - Stop-loss ordercreateTakeProfitOrder(symbol, side, amount, takeProfitPrice) - Take-profit ordercreateTrailingAmountOrder(symbol, side, amount, trailingAmount) - Trailing stopcreateTrailingPercentOrder(symbol, side, amount, trailingPercent) - Trailing stop %createTriggerOrder(symbol, side, amount, triggerPrice) - Trigger ordercreatePostOnlyOrder(symbol, side, amount, price) - Post-only ordercreateReduceOnlyOrder(symbol, side, amount, price) - Reduce-only ordercreateOrders([orders]) - Create multiple orders at oncecreateOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice) - OCO ordercancelAllOrders(symbol) - Cancel all orders for symboleditOrder(orderId, symbol, type, side, amount, price) - Modify orderfetchLeverageTiers(symbols) - Fetch leverage tiersfetchMarketLeverageTiers(symbol) - Leverage tiers for marketsetMarginMode(marginMode, symbol) - Set margin mode (cross/isolated)fetchMarginMode(symbol) - Fetch margin modedeposit(code, amount, params) - Deposit funds (if supported)watchBalance, watchOrders, watchMyTrades, watchPositionscreateStopLossOrderWs - Stop-loss order via WebSocketcreateTakeProfitOrderWs - Take-profit order via WebSocketcreateTrailingAmountOrderWs - Trailing stop via WebSocketcreateTrailingPercentOrderWs - Trailing stop % via WebSocketcreatePostOnlyOrderWs - Post-only order via WebSocketcreateReduceOnlyOrderWs - Reduce-only order via WebSocketfetchTradingFeesWs - Fetch trading fees via WebSocket