Claude-skill-registry ccxt-php
CCXT cryptocurrency exchange library for PHP developers. Covers both REST API (standard) and WebSocket API (real-time). Helps install CCXT, connect to exchanges, fetch market data, place orders, stream live tickers/orderbooks, handle authentication, and manage errors in PHP 8.1+. Use when working with crypto exchanges in PHP projects, trading bots, or web applications. Supports both sync and async (ReactPHP) usage.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/ccxt-php" ~/.claude/skills/majiayu000-claude-skill-registry-ccxt-php && rm -rf "$T"
skills/data/ccxt-php/SKILL.mdCCXT for PHP
A comprehensive guide to using CCXT in PHP projects for cryptocurrency exchange integration.
Installation
Via Composer (REST and WebSocket)
composer require ccxt/ccxt
Required PHP Extensions
- cURL
- mbstring (UTF-8)
- PCRE
- iconv
- gmp (for some exchanges)
Optional for Async/WebSocket
- ReactPHP (installed automatically with ccxt)
Quick Start
REST API - Synchronous
<?php date_default_timezone_set('UTC'); // Required! require_once 'vendor/autoload.php'; $exchange = new \ccxt\binance(); $exchange->load_markets(); $ticker = $exchange->fetch_ticker('BTC/USDT'); print_r($ticker);
REST API - Asynchronous (ReactPHP)
<?php use function React\Async\await; date_default_timezone_set('UTC'); require_once 'vendor/autoload.php'; $exchange = new \ccxt\async\binance(); $ticker = await($exchange->fetch_ticker('BTC/USDT')); print_r($ticker);
WebSocket API - Real-time Updates
<?php use function React\Async\await; use function React\Async\async; date_default_timezone_set('UTC'); require_once 'vendor/autoload.php'; $exchange = new \ccxt\pro\binance(); while (true) { $ticker = await($exchange->watch_ticker('BTC/USDT')); print_r($ticker); // Live updates! } await($exchange->close());
REST vs WebSocket
| Mode | REST | WebSocket |
|---|---|---|
| Sync | | (WebSocket requires async) |
| Async | | |
| Feature | REST API | WebSocket API |
|---|---|---|
| Use for | One-time queries, placing orders | Real-time monitoring, live price feeds |
| Method prefix | (fetch_ticker, fetch_order_book) | (watch_ticker, watch_order_book) |
| Speed | Slower (HTTP request/response) | Faster (persistent connection) |
| Rate limits | Strict (1-2 req/sec) | More lenient (continuous stream) |
| Best for | Trading, account management | Price monitoring, arbitrage detection |
Creating Exchange Instance
REST API - Synchronous
<?php date_default_timezone_set('UTC'); require_once 'vendor/autoload.php'; // Public API (no authentication) $exchange = new \ccxt\binance([ 'enableRateLimit' => true // Recommended! ]); // Private API (with authentication) $exchange = new \ccxt\binance([ 'apiKey' => 'YOUR_API_KEY', 'secret' => 'YOUR_SECRET', 'enableRateLimit' => true ]);
REST API - Asynchronous
<?php use function React\Async\await; $exchange = new \ccxt\async\binance([ 'enableRateLimit' => true ]); $ticker = await($exchange->fetch_ticker('BTC/USDT'));
WebSocket API
<?php use function React\Async\await; // Public WebSocket $exchange = new \ccxt\pro\binance(); // Private WebSocket (with authentication) $exchange = new \ccxt\pro\binance([ 'apiKey' => 'YOUR_API_KEY', 'secret' => 'YOUR_SECRET' ]); // Always close when done await($exchange->close());
Common REST Operations
Loading Markets
// Load all available trading pairs $exchange->load_markets(); // Access market information $btc_market = $exchange->market('BTC/USDT'); print_r($btc_market['limits']['amount']['min']); // Minimum order amount
Fetching Ticker
// Single ticker $ticker = $exchange->fetch_ticker('BTC/USDT'); print_r($ticker['last']); // Last price print_r($ticker['bid']); // Best bid print_r($ticker['ask']); // Best ask print_r($ticker['volume']); // 24h volume // Multiple tickers (if supported) $tickers = $exchange->fetch_tickers(['BTC/USDT', 'ETH/USDT']);
Fetching Order Book
// Full orderbook $orderbook = $exchange->fetch_order_book('BTC/USDT'); print_r($orderbook['bids'][0]); // [price, amount] print_r($orderbook['asks'][0]); // [price, amount] // Limited depth $orderbook = $exchange->fetch_order_book('BTC/USDT', 5); // Top 5 levels
Creating Orders
Limit Order
// Buy limit order $order = $exchange->create_limit_buy_order('BTC/USDT', 0.01, 50000); print_r($order['id']); // Sell limit order $order = $exchange->create_limit_sell_order('BTC/USDT', 0.01, 60000); // Generic limit order $order = $exchange->create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000);
Market Order
// Buy market order $order = $exchange->create_market_buy_order('BTC/USDT', 0.01); // Sell market order $order = $exchange->create_market_sell_order('BTC/USDT', 0.01); // Generic market order $order = $exchange->create_order('BTC/USDT', 'market', 'sell', 0.01);
Fetching Balance
$balance = $exchange->fetch_balance(); print_r($balance['BTC']['free']); // Available balance print_r($balance['BTC']['used']); // Balance in orders print_r($balance['BTC']['total']); // Total balance
Fetching Orders
// Open orders $open_orders = $exchange->fetch_open_orders('BTC/USDT'); // Closed orders $closed_orders = $exchange->fetch_closed_orders('BTC/USDT'); // All orders (open + closed) $all_orders = $exchange->fetch_orders('BTC/USDT'); // Single order by ID $order = $exchange->fetch_order($order_id, 'BTC/USDT');
Fetching Trades
// Recent public trades $trades = $exchange->fetch_trades('BTC/USDT', null, 10); // Your trades (requires authentication) $my_trades = $exchange->fetch_my_trades('BTC/USDT');
Canceling Orders
// Cancel single order $exchange->cancel_order($order_id, 'BTC/USDT'); // Cancel all orders for a symbol $exchange->cancel_all_orders('BTC/USDT');
WebSocket Operations (Real-time)
Watching Ticker (Live Price Updates)
<?php use function React\Async\await; $exchange = new \ccxt\pro\binance(); while (true) { $ticker = await($exchange->watch_ticker('BTC/USDT')); print_r($ticker['last']); } await($exchange->close());
Watching Order Book (Live Depth Updates)
<?php use function React\Async\await; $exchange = new \ccxt\pro\binance(); while (true) { $orderbook = await($exchange->watch_order_book('BTC/USDT')); print_r('Best bid: ' . $orderbook['bids'][0][0]); print_r('Best ask: ' . $orderbook['asks'][0][0]); } await($exchange->close());
Watching Trades (Live Trade Stream)
<?php use function React\Async\await; $exchange = new \ccxt\pro\binance(); while (true) { $trades = await($exchange->watch_trades('BTC/USDT')); foreach ($trades as $trade) { print_r($trade['price'] . ' ' . $trade['amount'] . ' ' . $trade['side']); } } await($exchange->close());
Watching Your Orders (Live Order Updates)
<?php use function React\Async\await; $exchange = new \ccxt\pro\binance([ 'apiKey' => 'YOUR_API_KEY', 'secret' => 'YOUR_SECRET' ]); while (true) { $orders = await($exchange->watch_orders('BTC/USDT')); foreach ($orders as $order) { print_r($order['id'] . ' ' . $order['status'] . ' ' . $order['filled']); } } await($exchange->close());
Watching Balance (Live Balance Updates)
<?php use function React\Async\await; $exchange = new \ccxt\pro\binance([ 'apiKey' => 'YOUR_API_KEY', 'secret' => 'YOUR_SECRET' ]); while (true) { $balance = await($exchange->watch_balance()); print_r('BTC: ' . $balance['BTC']['total']); } await($exchange->close());
Complete Method Reference
Market Data Methods
Tickers & Prices
- Fetch ticker for one symbolfetchTicker(symbol)
- Fetch multiple tickers at oncefetchTickers([symbols])
- Fetch best bid/ask for multiple symbolsfetchBidsAsks([symbols])
- Fetch last pricesfetchLastPrices([symbols])
- Fetch mark prices (derivatives)fetchMarkPrices([symbols])
Order Books
- Fetch order bookfetchOrderBook(symbol, limit)
- Fetch multiple order booksfetchOrderBooks([symbols])
- Fetch level 2 order bookfetchL2OrderBook(symbol)
- Fetch level 3 order book (if supported)fetchL3OrderBook(symbol)
Trades
- Fetch public tradesfetchTrades(symbol, since, limit)
- Fetch your trades (auth required)fetchMyTrades(symbol, since, limit)
- Fetch trades for specific orderfetchOrderTrades(orderId, symbol)
OHLCV (Candlesticks)
- Fetch candlestick datafetchOHLCV(symbol, timeframe, since, limit)
- Fetch index price OHLCVfetchIndexOHLCV(symbol, timeframe)
- Fetch mark price OHLCVfetchMarkOHLCV(symbol, timeframe)
- Fetch premium index OHLCVfetchPremiumIndexOHLCV(symbol, timeframe)
Account & Balance
- Fetch account balance (auth required)fetchBalance()
- Fetch sub-accountsfetchAccounts()
- Fetch ledger historyfetchLedger(code, since, limit)
- Fetch specific ledger entryfetchLedgerEntry(id, code)
- Fetch transactionsfetchTransactions(code, since, limit)
- Fetch deposit historyfetchDeposits(code, since, limit)
- Fetch withdrawal historyfetchWithdrawals(code, since, limit)
- Fetch both deposits and withdrawalsfetchDepositsWithdrawals(code, since, limit)
Trading Methods
Creating Orders
- Create order (generic)createOrder(symbol, type, side, amount, price, params)
- Create limit ordercreateLimitOrder(symbol, side, amount, price)
- Create market ordercreateMarketOrder(symbol, side, amount)
- Buy limit ordercreateLimitBuyOrder(symbol, amount, price)
- Sell limit ordercreateLimitSellOrder(symbol, amount, price)
- Buy market ordercreateMarketBuyOrder(symbol, amount)
- Sell market ordercreateMarketSellOrder(symbol, amount)
- Buy with specific costcreateMarketBuyOrderWithCost(symbol, cost)
- Stop-limit ordercreateStopLimitOrder(symbol, side, amount, price, stopPrice)
- Stop-market ordercreateStopMarketOrder(symbol, side, amount, stopPrice)
- Stop-loss ordercreateStopLossOrder(symbol, side, amount, stopPrice)
- Take-profit ordercreateTakeProfitOrder(symbol, side, amount, takeProfitPrice)
- Trailing stopcreateTrailingAmountOrder(symbol, side, amount, trailingAmount)
- Trailing stop %createTrailingPercentOrder(symbol, side, amount, trailingPercent)
- Trigger ordercreateTriggerOrder(symbol, side, amount, triggerPrice)
- Post-only ordercreatePostOnlyOrder(symbol, side, amount, price)
- Reduce-only ordercreateReduceOnlyOrder(symbol, side, amount, price)
- Create multiple orders at oncecreateOrders([orders])
- OCO ordercreateOrderWithTakeProfitAndStopLoss(symbol, type, side, amount, price, tpPrice, slPrice)
Managing Orders
- Fetch single orderfetchOrder(orderId, symbol)
- Fetch all ordersfetchOrders(symbol, since, limit)
- Fetch open ordersfetchOpenOrders(symbol, since, limit)
- Fetch closed ordersfetchClosedOrders(symbol, since, limit)
- Fetch canceled ordersfetchCanceledOrders(symbol, since, limit)
- Fetch specific open orderfetchOpenOrder(orderId, symbol)
- Fetch orders by statusfetchOrdersByStatus(status, symbol)
- Cancel single ordercancelOrder(orderId, symbol)
- Cancel multiple orderscancelOrders([orderIds], symbol)
- Cancel all orders for symbolcancelAllOrders(symbol)
- Modify ordereditOrder(orderId, symbol, type, side, amount, price)
Margin & Leverage
- Fetch borrow rate for marginfetchBorrowRate(code)
- Fetch multiple borrow ratesfetchBorrowRates([codes])
- Historical borrow ratesfetchBorrowRateHistory(code, since, limit)
- Cross margin borrow ratefetchCrossBorrowRate(code)
- Isolated margin borrow ratefetchIsolatedBorrowRate(symbol, code)
- Borrow marginborrowMargin(code, amount, symbol)
- Repay marginrepayMargin(code, amount, symbol)
- Fetch leveragefetchLeverage(symbol)
- Set leveragesetLeverage(leverage, symbol)
- Fetch leverage tiersfetchLeverageTiers(symbols)
- Leverage tiers for marketfetchMarketLeverageTiers(symbol)
- Set margin mode (cross/isolated)setMarginMode(marginMode, symbol)
- Fetch margin modefetchMarginMode(symbol)
Derivatives & Futures
Positions
- Fetch single positionfetchPosition(symbol)
- Fetch all positionsfetchPositions([symbols])
- Fetch positions for symbolfetchPositionsForSymbol(symbol)
- Position historyfetchPositionHistory(symbol, since, limit)
- Multiple position historyfetchPositionsHistory(symbols, since, limit)
- Fetch position mode (one-way/hedge)fetchPositionMode(symbol)
- Set position modesetPositionMode(hedged, symbol)
- Close positionclosePosition(symbol, side)
- Close all positionscloseAllPositions()
Funding & Settlement
- Current funding ratefetchFundingRate(symbol)
- Multiple funding ratesfetchFundingRates([symbols])
- Funding rate historyfetchFundingRateHistory(symbol, since, limit)
- Your funding paymentsfetchFundingHistory(symbol, since, limit)
- Funding intervalfetchFundingInterval(symbol)
- Settlement historyfetchSettlementHistory(symbol, since, limit)
- Your settlement historyfetchMySettlementHistory(symbol, since, limit)
Open Interest & Liquidations
- Open interest for symbolfetchOpenInterest(symbol)
- Multiple open interestsfetchOpenInterests([symbols])
- OI historyfetchOpenInterestHistory(symbol, timeframe, since, limit)
- Public liquidationsfetchLiquidations(symbol, since, limit)
- Your liquidationsfetchMyLiquidations(symbol, since, limit)
Options
- Fetch option infofetchOption(symbol)
- Fetch option chainfetchOptionChain(code)
- Fetch option greeksfetchGreeks(symbol)
- Volatility historyfetchVolatilityHistory(code, since, limit)
- Fetch underlying assetsfetchUnderlyingAssets()
Fees & Limits
- Trading fee for symbolfetchTradingFee(symbol)
- Trading fees for multiple symbolsfetchTradingFees([symbols])
- Trading limitsfetchTradingLimits([symbols])
- Transaction/withdrawal feefetchTransactionFee(code)
- Multiple transaction feesfetchTransactionFees([codes])
- Deposit/withdrawal feefetchDepositWithdrawFee(code)
- Multiple deposit/withdraw feesfetchDepositWithdrawFees([codes])
Deposits & Withdrawals
- Get deposit addressfetchDepositAddress(code, params)
- Multiple deposit addressesfetchDepositAddresses([codes])
- Addresses by networkfetchDepositAddressesByNetwork(code)
- Create new deposit addresscreateDepositAddress(code, params)
- Fetch single depositfetchDeposit(id, code)
- Fetch single withdrawalfetchWithdrawal(id, code)
- Fetch withdrawal addressesfetchWithdrawAddresses(code)
- Fetch whitelistfetchWithdrawalWhitelist(code)
- Withdraw fundswithdraw(code, amount, address, tag, params)
- Deposit funds (if supported)deposit(code, amount, params)
Transfer & Convert
- Internal transfertransfer(code, amount, fromAccount, toAccount)
- Fetch transfer infofetchTransfer(id, code)
- Fetch transfer historyfetchTransfers(code, since, limit)
- Currencies available for convertfetchConvertCurrencies()
- Get conversion quotefetchConvertQuote(fromCode, toCode, amount)
- Execute conversioncreateConvertTrade(fromCode, toCode, amount)
- Fetch convert tradefetchConvertTrade(id)
- Convert historyfetchConvertTradeHistory(code, since, limit)
Market Info
- Fetch all marketsfetchMarkets()
- Fetch all currenciesfetchCurrencies()
- Fetch exchange server timefetchTime()
- Fetch exchange statusfetchStatus()
- Borrow interest paidfetchBorrowInterest(code, symbol, since, limit)
- Long/short ratiofetchLongShortRatio(symbol, timeframe, since, limit)
- L/S ratio historyfetchLongShortRatioHistory(symbol, timeframe, since, limit)
WebSocket Methods (ccxt.pro)
All REST methods have WebSocket equivalents with
watch* prefix:
Real-time Market Data
- Watch single tickerwatchTicker(symbol)
- Watch multiple tickerswatchTickers([symbols])
- Watch order book updateswatchOrderBook(symbol)
- Watch multiple order bookswatchOrderBookForSymbols([symbols])
- Watch public tradeswatchTrades(symbol)
- Watch candlestick updateswatchOHLCV(symbol, timeframe)
- Watch best bid/askwatchBidsAsks([symbols])
Real-time Account Data (Auth Required)
- Watch balance updateswatchBalance()
- Watch your order updateswatchOrders(symbol)
- Watch your trade updateswatchMyTrades(symbol)
- Watch position updateswatchPositions([symbols])
- Watch positions for symbolwatchPositionsForSymbol(symbol)
Authentication Required
Methods marked with 🔒 require API credentials:
- All
methods (creating orders, addresses)create* - All
methods (canceling orders)cancel* - All
methods (modifying orders)edit* - All
methods (your trades, orders)fetchMy*
,fetchBalance
,fetchLedgerfetchAccounts
,withdraw
,transferdeposit- Margin/leverage methods
- Position methods
,watchBalance
,watchOrders
,watchMyTradeswatchPositions
Checking Method Availability
Not 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, // ... // }
Method Naming Convention
- REST API methods (HTTP requests)fetch*
- WebSocket methods (real-time streams)watch*
- Create new resources (orders, addresses)create*
- Cancel existing resourcescancel*
- Modify existing resourcesedit*
- Configure settings (leverage, margin mode)set*
suffix - WebSocket variant (some exchanges)*Ws
Proxy Configuration
CCXT supports HTTP, HTTPS, and SOCKS proxies for both REST and WebSocket connections.
Setting Proxy
// 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'
Proxy for WebSocket
WebSocket connections also respect proxy settings:
exchange.httpsProxy = 'https://proxy:8080' // WebSocket connections will use this proxy
Testing Proxy Connection
exchange.httpProxy = 'http://localhost:8080' try { await exchange.fetchTicker('BTC/USDT') console.log('Proxy working!') } catch (error) { console.error('Proxy connection failed:', error) }
WebSocket-Specific Methods
Some exchanges provide WebSocket variants of REST methods for faster order placement and management. These use the
*Ws suffix:
Trading via WebSocket
Creating Orders:
- Create order via WebSocket (faster than REST)createOrderWs
- Create limit order via WebSocketcreateLimitOrderWs
- Create market order via WebSocketcreateMarketOrderWs
- Buy limit order via WebSocketcreateLimitBuyOrderWs
- Sell limit order via WebSocketcreateLimitSellOrderWs
- Buy market order via WebSocketcreateMarketBuyOrderWs
- Sell market order via WebSocketcreateMarketSellOrderWs
- Stop-limit order via WebSocketcreateStopLimitOrderWs
- Stop-market order via WebSocketcreateStopMarketOrderWs
- Stop-loss order via WebSocketcreateStopLossOrderWs
- Take-profit order via WebSocketcreateTakeProfitOrderWs
- Trailing stop via WebSocketcreateTrailingAmountOrderWs
- Trailing stop % via WebSocketcreateTrailingPercentOrderWs
- Post-only order via WebSocketcreatePostOnlyOrderWs
- Reduce-only order via WebSocketcreateReduceOnlyOrderWs
Managing Orders:
- Edit order via WebSocketeditOrderWs
- Cancel order via WebSocket (faster than REST)cancelOrderWs
- Cancel multiple orders via WebSocketcancelOrdersWs
- Cancel all orders via WebSocketcancelAllOrdersWs
Fetching Data:
- Fetch order via WebSocketfetchOrderWs
- Fetch orders via WebSocketfetchOrdersWs
- Fetch open orders via WebSocketfetchOpenOrdersWs
- Fetch closed orders via WebSocketfetchClosedOrdersWs
- Fetch your trades via WebSocketfetchMyTradesWs
- Fetch balance via WebSocketfetchBalanceWs
- Fetch position via WebSocketfetchPositionWs
- Fetch positions via WebSocketfetchPositionsWs
- Fetch positions for symbol via WebSocketfetchPositionsForSymbolWs
- Fetch trading fees via WebSocketfetchTradingFeesWs
When to Use WebSocket Methods
Use
methods when:*Ws
- You need faster order placement (lower latency)
- You're already connected via WebSocket
- You want to reduce REST API rate limit usage
- Trading strategies require sub-100ms latency
Use REST methods when:
- You need guaranteed execution confirmation
- You're making one-off requests
- The exchange doesn't support the WebSocket variant
- You need detailed error responses
Example: Order Placement Comparison
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)
Checking WebSocket Method Availability
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) }
Authentication
Setting API Keys
<?php // During instantiation (recommended) $exchange = new \ccxt\binance([ 'apiKey' => getenv('BINANCE_API_KEY'), 'secret' => getenv('BINANCE_SECRET'), 'enableRateLimit' => true ]); // After instantiation $exchange->apiKey = getenv('BINANCE_API_KEY'); $exchange->secret = getenv('BINANCE_SECRET');
Testing Authentication
try { $balance = $exchange->fetch_balance(); print_r('Authentication successful!'); } catch (\ccxt\AuthenticationError $e) { print_r('Invalid API credentials'); }
Error Handling
Exception Hierarchy
BaseError ├─ NetworkError (recoverable - retry) │ ├─ RequestTimeout │ ├─ ExchangeNotAvailable │ ├─ RateLimitExceeded │ └─ DDoSProtection └─ ExchangeError (non-recoverable - don't retry) ├─ AuthenticationError ├─ InsufficientFunds ├─ InvalidOrder └─ NotSupported
Basic Error Handling
<?php try { $ticker = $exchange->fetch_ticker('BTC/USDT'); } catch (\ccxt\NetworkError $e) { echo 'Network error - retry: ' . $e->getMessage(); } catch (\ccxt\ExchangeError $e) { echo 'Exchange error - do not retry: ' . $e->getMessage(); } catch (\Exception $e) { echo 'Unknown error: ' . $e->getMessage(); }
Specific Exception Handling
<?php try { $order = $exchange->create_order('BTC/USDT', 'limit', 'buy', 0.01, 50000); } catch (\ccxt\InsufficientFunds $e) { echo 'Not enough balance'; } catch (\ccxt\InvalidOrder $e) { echo 'Invalid order parameters'; } catch (\ccxt\RateLimitExceeded $e) { echo 'Rate limit hit - wait before retrying'; sleep(1); // Wait 1 second } catch (\ccxt\AuthenticationError $e) { echo 'Check your API credentials'; }
Retry Logic for Network Errors
<?php function fetch_with_retry($exchange, $max_retries = 3) { for ($i = 0; $i < $max_retries; $i++) { try { return $exchange->fetch_ticker('BTC/USDT'); } catch (\ccxt\NetworkError $e) { if ($i < $max_retries - 1) { echo "Retry " . ($i + 1) . "/$max_retries\n"; sleep(1 * ($i + 1)); // Exponential backoff } else { throw $e; } } } }
Rate Limiting
Built-in Rate Limiter (Recommended)
$exchange = new \ccxt\binance([ 'enableRateLimit' => true // Automatically throttles requests ]);
Manual Delays
$exchange->fetch_ticker('BTC/USDT'); usleep($exchange->rateLimit * 1000); // Convert ms to microseconds $exchange->fetch_ticker('ETH/USDT');
Checking Rate Limit
print_r($exchange->rateLimit); // Milliseconds between requests
Common Pitfalls
Forgetting Timezone Setting
// Wrong - will cause errors <?php require_once 'vendor/autoload.php'; $exchange = new \ccxt\binance(); // ERROR! // Correct <?php date_default_timezone_set('UTC'); // Required! require_once 'vendor/autoload.php'; $exchange = new \ccxt\binance();
Wrong Namespace Format
// Wrong - missing leading backslash $exchange = new ccxt\binance(); // May fail! // Correct $exchange = new \ccxt\binance(); // Leading backslash!
Using REST for Real-time Monitoring
// Wrong - wastes rate limits while (true) { $ticker = $exchange->fetch_ticker('BTC/USDT'); // REST print_r($ticker['last']); sleep(1); } // Correct - use WebSocket use function React\Async\await; $exchange = new \ccxt\pro\binance(); while (true) { $ticker = await($exchange->watch_ticker('BTC/USDT')); // WebSocket print_r($ticker['last']); }
Not Closing WebSocket Connections
// Wrong - memory leak $exchange = new \ccxt\pro\binance(); $ticker = await($exchange->watch_ticker('BTC/USDT')); // Forgot to close! // Correct $exchange = new \ccxt\pro\binance(); try { while (true) { $ticker = await($exchange->watch_ticker('BTC/USDT')); } } finally { await($exchange->close()); }
Not Checking PHP Extensions
// Check required extensions before running <?php $required = ['curl', 'mbstring', 'iconv', 'gmp']; foreach ($required as $ext) { if (!extension_loaded($ext)) { die("Error: $ext extension is not loaded\n"); } }
Troubleshooting
Common Issues
1. "date_default_timezone_get(): Invalid date.timezone"
- Solution: Add
at the topdate_default_timezone_set('UTC');
2. "Class 'ccxt\binance' not found"
- Solution: Run
composer require ccxt/ccxt - Check you're using
with leading backslash\ccxt\binance
3. "RateLimitExceeded"
- Solution: Enable rate limiter:
'enableRateLimit' => true
4. "AuthenticationError"
- Solution: Check API key and secret
- Verify API key permissions on exchange
- Check system clock is synced
5. "InvalidNonce"
- Solution: Sync system clock
- Use only one exchange instance per API key
6. Missing PHP extensions
- Solution: Install required extensions:
- Ubuntu/Debian:
apt-get install php-curl php-mbstring php-gmp - macOS: Usually pre-installed
- Windows: Enable in php.ini
- Ubuntu/Debian:
Debugging
// Enable verbose logging $exchange->verbose = true; // Check exchange capabilities print_r($exchange->has); // Array( // 'fetchTicker' => true, // 'fetchOrderBook' => true, // 'createOrder' => true, // ... // ) // Check market information print_r($exchange->markets['BTC/USDT']); // Check last request/response print_r($exchange->last_http_response); print_r($exchange->last_json_response);