第二章:基础概念与快速开始
🎯 核心概念详解
在开始使用 CCXT 之前,了解以下核心概念非常重要:
🏛️ Exchange(交易所)
交易所是 CCXT 中的核心对象,代表一个特定的加密货币交易平台。
javascript
// JavaScript - 创建交易所实例
const ccxt = require('ccxt');
// 直接实例化(不需要API密钥的公开功能)
const binance = new ccxt.binance();
const coinbase = new ccxt.coinbasepro();
const kraken = new ccxt.kraken();
// 带配置的实例化
const authenticatedExchange = new ccxt.binance({
apiKey: 'your-api-key',
secret: 'your-secret',
enableRateLimit: true, // 启用自动限速
sandbox: true, // 沙盒模式(测试环境)
timeout: 30000, // 超时时间(毫秒)
verbose: false, // 详细日志
});
python
# Python
import ccxt
# 基础实例化
binance = ccxt.binance()
coinbase = ccxt.coinbasepro()
kraken = ccxt.kraken()
# 带配置的实例化
authenticated_exchange = ccxt.binance({
'apiKey': 'your-api-key',
'secret': 'your-secret',
'enableRateLimit': True,
'sandbox': True,
'timeout': 30000,
'verbose': False,
})
💱 Symbol(交易对)
交易对表示两种资产之间的交易关系,格式为 BASE/QUOTE
。
javascript
// 常见交易对格式
const symbols = [
'BTC/USDT', // 比特币对泰达币
'ETH/BTC', // 以太坊对比特币
'BNB/USDT', // 币安币对泰达币
'ADA/ETH', // 艾达币对以太坊
'DOT/USD', // 波卡对美元
];
// 解析交易对
function parseSymbol(symbol) {
const [base, quote] = symbol.split('/');
return {
symbol: symbol,
base: base, // 基础货币(要买卖的)
quote: quote, // 计价货币(用来支付的)
};
}
console.log(parseSymbol('BTC/USDT'));
// 输出: { symbol: 'BTC/USDT', base: 'BTC', quote: 'USDT' }
📊 Market(市场)
市场包含了交易对的详细信息,如精度、限制、手续费等。
javascript
// 加载市场数据
const exchange = new ccxt.binance();
async function exploreMarkets() {
// 加载所有市场
await exchange.loadMarkets();
// 查看特定市场信息
const market = exchange.markets['BTC/USDT'];
console.log('BTC/USDT 市场信息:', {
id: market.id, // 交易所内部ID
symbol: market.symbol, // 统一交易对符号
base: market.base, // 基础货币
quote: market.quote, // 计价货币
active: market.active, // 是否活跃
type: market.type, // spot, future, option
spot: market.spot, // 是否为现货
future: market.future, // 是否为期货
precision: {
amount: market.precision.amount, // 数量精度
price: market.precision.price, // 价格精度
},
limits: {
amount: market.limits.amount, // 数量限制
price: market.limits.price, // 价格限制
cost: market.limits.cost, // 成本限制
},
fees: market.fees, // 手续费信息
});
}
exploreMarkets();
🎫 Ticker(行情)
行情数据包含了交易对的当前价格信息。
javascript
// 获取行情数据结构
const ticker = {
symbol: 'BTC/USDT', // 交易对
timestamp: 1640995200000, // 时间戳
datetime: '2022-01-01T00:00:00.000Z', // ISO 8601 格式时间
high: 47500.00, // 24小时最高价
low: 46000.00, // 24小时最低价
bid: 47100.00, // 买一价
bidVolume: 1.5, // 买一量
ask: 47200.00, // 卖一价
askVolume: 2.3, // 卖一量
vwap: 46800.00, // 成交量加权平均价
open: 46500.00, // 开盘价
close: 47150.00, // 收盘价
last: 47150.00, // 最新价
previousClose: 46500.00, // 前收盘价
change: 650.00, // 价格变化
percentage: 1.4, // 涨跌幅百分比
average: 46825.00, // 平均价
baseVolume: 12450.5, // 基础货币成交量
quoteVolume: 582847650.25, // 计价货币成交量
info: {}, // 原始数据
};
📖 Order Book(订单簿)
订单簿显示了当前的买卖盘深度信息。
javascript
// 订单簿数据结构
const orderbook = {
symbol: 'BTC/USDT',
timestamp: 1640995200000,
datetime: '2022-01-01T00:00:00.000Z',
nonce: 123456789,
bids: [ // 买盘(降序排列)
[47100.00, 1.5], // [价格, 数量]
[47090.00, 2.3],
[47080.00, 0.8],
// ...
],
asks: [ // 卖盘(升序排列)
[47200.00, 2.1], // [价格, 数量]
[47210.00, 1.9],
[47220.00, 3.2],
// ...
],
info: {}, // 原始数据
};
// 分析订单簿
function analyzeOrderBook(orderbook) {
const bestBid = orderbook.bids[0];
const bestAsk = orderbook.asks[0];
const spread = bestAsk[0] - bestBid[0];
const spreadPercent = (spread / bestBid[0]) * 100;
return {
bestBidPrice: bestBid[0],
bestBidAmount: bestBid[1],
bestAskPrice: bestAsk[0],
bestAskAmount: bestAsk[1],
spread: spread,
spreadPercent: spreadPercent.toFixed(4) + '%',
};
}
🚀 交易所实例化详解
基本实例化模式
javascript
// 1. 直接实例化
const binance = new ccxt.binance();
// 2. 使用变量动态实例化
const exchangeId = 'binance';
const ExchangeClass = ccxt[exchangeId];
const exchange = new ExchangeClass();
// 3. 使用 getattr 模式(Python 风格)
const exchange2 = new (ccxt['binance'])();
// 4. 条件实例化
function createExchange(exchangeName, config = {}) {
if (!(exchangeName in ccxt)) {
throw new Error(`不支持的交易所: ${exchangeName}`);
}
const ExchangeClass = ccxt[exchangeName];
return new ExchangeClass(config);
}
const kraken = createExchange('kraken', {
enableRateLimit: true,
timeout: 20000,
});
配置选项详解
javascript
const exchange = new ccxt.binance({
// === API 认证 ===
apiKey: 'your-api-key',
secret: 'your-secret',
password: 'passphrase', // 某些交易所需要
privateKey: 'private-key', // 某些交易所使用
walletAddress: 'wallet-address', // 某些交易所需要
// === 网络配置 ===
timeout: 30000, // 请求超时(毫秒)
enableRateLimit: true, // 启用限速(强烈推荐)
rateLimit: 1200, // 限速间隔(毫秒)
// === 环境配置 ===
sandbox: false, // 沙盒模式
testnet: false, // 测试网(某些交易所)
// === 调试配置 ===
verbose: false, // 详细日志
debug: false, // 调试模式
// === 代理配置 ===
proxy: 'http://proxy:8080', // HTTP 代理
agent: proxyAgent, // 自定义代理 agent
// === 其他选项 ===
adjustForTimeDifference: true, // 自动调整时间差
recvWindow: 5000, // 接收窗口(某些交易所)
// === 交易所特定选项 ===
options: {
defaultType: 'spot', // 默认交易类型
marginMode: 'cross', // 保证金模式
hedgeMode: false, // 对冲模式
},
// === 自定义 Headers ===
headers: {
'User-Agent': 'MyTradingBot/1.0',
},
});
Python 实例化示例
python
import ccxt
import os
# 基础实例化
binance = ccxt.binance()
# 完整配置实例化
exchange = ccxt.binance({
'apiKey': os.getenv('BINANCE_API_KEY'),
'secret': os.getenv('BINANCE_SECRET'),
'enableRateLimit': True,
'timeout': 30000,
'sandbox': True,
'options': {
'defaultType': 'spot',
},
})
# 动态实例化
def create_exchange(exchange_id, config=None):
if config is None:
config = {}
exchange_class = getattr(ccxt, exchange_id)
return exchange_class(config)
# 使用示例
kraken = create_exchange('kraken', {
'apiKey': os.getenv('KRAKEN_API_KEY'),
'secret': os.getenv('KRAKEN_SECRET'),
'enableRateLimit': True,
})
⚡ 快速开始:第一个程序
获取基础市场信息
javascript
// get-market-info.js
const ccxt = require('ccxt');
async function getMarketInfo() {
console.log('🚀 开始获取市场信息...\n');
try {
// 创建交易所实例
const binance = new ccxt.binance({
enableRateLimit: true,
});
console.log('📊 交易所信息:');
console.log(`名称: ${binance.name}`);
console.log(`ID: ${binance.id}`);
console.log(`国家: ${binance.countries}`);
console.log(`API版本: ${binance.version || 'N/A'}\n`);
// 加载市场
console.log('🔄 加载市场数据...');
await binance.loadMarkets();
console.log(`✅ 成功加载 ${binance.symbols.length} 个交易对\n`);
// 显示热门交易对
const popularSymbols = ['BTC/USDT', 'ETH/USDT', 'BNB/USDT', 'ADA/USDT', 'DOT/USDT'];
console.log('🔥 热门交易对信息:');
for (const symbol of popularSymbols) {
if (binance.symbols.includes(symbol)) {
const market = binance.markets[symbol];
console.log(`${symbol}:`);
console.log(` 类型: ${market.type}`);
console.log(` 状态: ${market.active ? '活跃' : '暂停'}`);
console.log(` 最小订单: ${market.limits.amount.min}`);
console.log(` 价格精度: ${market.precision.price}`);
console.log('');
}
}
} catch (error) {
console.error('❌ 错误:', error.message);
}
}
// 运行程序
getMarketInfo();
获取实时行情数据
javascript
// get-ticker-data.js
const ccxt = require('ccxt');
async function getTickerData() {
const exchange = new ccxt.binance({ enableRateLimit: true });
try {
console.log('💰 获取实时行情数据...\n');
// 获取单个行情
const btcTicker = await exchange.fetchTicker('BTC/USDT');
console.log('📈 BTC/USDT 行情:');
console.log(`最新价: $${btcTicker.last}`);
console.log(`24h最高: $${btcTicker.high}`);
console.log(`24h最低: $${btcTicker.low}`);
console.log(`24h成交量: ${btcTicker.baseVolume?.toFixed(2)} BTC`);
console.log(`24h涨跌幅: ${btcTicker.percentage?.toFixed(2)}%`);
console.log(`买一价: $${btcTicker.bid}`);
console.log(`卖一价: $${btcTicker.ask}`);
const spread = btcTicker.ask - btcTicker.bid;
const spreadPercent = (spread / btcTicker.bid * 100).toFixed(4);
console.log(`价差: $${spread.toFixed(2)} (${spreadPercent}%)\n`);
// 获取多个行情
const symbols = ['ETH/USDT', 'BNB/USDT', 'ADA/USDT'];
console.log('📊 其他主流币种行情:');
for (const symbol of symbols) {
try {
const ticker = await exchange.fetchTicker(symbol);
console.log(`${symbol}: $${ticker.last} (${ticker.percentage?.toFixed(2)}%)`);
// 避免频率限制
await exchange.sleep(exchange.rateLimit);
} catch (error) {
console.log(`${symbol}: 获取失败 - ${error.message}`);
}
}
} catch (error) {
console.error('❌ 获取行情失败:', error.message);
}
}
getTickerData();
获取订单簿数据
javascript
// get-orderbook.js
const ccxt = require('ccxt');
async function getOrderBook() {
const exchange = new ccxt.binance({ enableRateLimit: true });
try {
console.log('📖 获取订单簿数据...\n');
// 获取订单簿(限制深度为10)
const orderbook = await exchange.fetchOrderBook('BTC/USDT', 10);
console.log('📈 BTC/USDT 订单簿:');
console.log(`时间: ${new Date(orderbook.timestamp).toISOString()}\n`);
// 显示卖盘(从高到低)
console.log('🔴 卖盘 (ASK):');
orderbook.asks.reverse().forEach((ask, index) => {
const [price, amount] = ask;
const total = price * amount;
console.log(` ${String(index + 1).padStart(2)}: $${price.toFixed(2)} × ${amount.toFixed(4)} = $${total.toFixed(2)}`);
});
// 显示价差
const bestBid = orderbook.bids[0][0];
const bestAsk = orderbook.asks[0][0];
const spread = bestAsk - bestBid;
const spreadPercent = (spread / bestBid * 100).toFixed(4);
console.log(`\n💰 价差: $${spread.toFixed(2)} (${spreadPercent}%)\n`);
// 显示买盘(从高到低)
console.log('🟢 买盘 (BID):');
orderbook.bids.forEach((bid, index) => {
const [price, amount] = bid;
const total = price * amount;
console.log(` ${String(index + 1).padStart(2)}: $${price.toFixed(2)} × ${amount.toFixed(4)} = $${total.toFixed(2)}`);
});
// 计算深度统计
const bidDepth = orderbook.bids.reduce((sum, bid) => sum + bid[1], 0);
const askDepth = orderbook.asks.reduce((sum, ask) => sum + ask[1], 0);
console.log(`\n📊 深度统计:`);
console.log(`买盘总量: ${bidDepth.toFixed(4)} BTC`);
console.log(`卖盘总量: ${askDepth.toFixed(4)} BTC`);
console.log(`买卖比: ${(bidDepth / askDepth).toFixed(2)}`);
} catch (error) {
console.error('❌ 获取订单簿失败:', error.message);
}
}
getOrderBook();
Python 快速开始示例
python
# quick_start.py
import ccxt
import asyncio
from datetime import datetime
async def quick_start_demo():
"""CCXT Python 快速开始演示"""
print('🚀 CCXT Python 快速开始演示\n')
# 创建交易所实例
exchange = ccxt.binance({
'enableRateLimit': True,
})
try:
# 1. 获取交易所基本信息
print('📊 交易所信息:')
print(f'名称: {exchange.name}')
print(f'ID: {exchange.id}')
print(f'支持的功能: {list(exchange.has.keys())[:10]}...\n')
# 2. 加载市场
print('🔄 加载市场数据...')
markets = exchange.load_markets()
print(f'✅ 加载了 {len(markets)} 个交易对\n')
# 3. 获取行情数据
print('💰 获取BTC行情:')
ticker = exchange.fetch_ticker('BTC/USDT')
print(f"最新价: ${ticker['last']}")
print(f"24h涨跌: {ticker['percentage']:.2f}%")
print(f"24h成交量: {ticker['baseVolume']:.2f} BTC")
print(f"更新时间: {datetime.fromtimestamp(ticker['timestamp']/1000)}\n")
# 4. 获取多个行情
symbols = ['ETH/USDT', 'BNB/USDT', 'ADA/USDT']
print('📈 主流币种行情:')
for symbol in symbols:
try:
ticker = exchange.fetch_ticker(symbol)
print(f"{symbol}: ${ticker['last']} ({ticker['percentage']:.2f}%)")
except Exception as e:
print(f"{symbol}: 获取失败 - {e}")
print('\n🎉 演示完成!')
except Exception as error:
print(f'❌ 错误: {error}')
# 运行演示
if __name__ == '__main__':
asyncio.run(quick_start_demo())
综合示例:市场分析器
javascript
// market-analyzer.js
const ccxt = require('ccxt');
class MarketAnalyzer {
constructor(exchangeId = 'binance') {
this.exchange = new ccxt[exchangeId]({
enableRateLimit: true,
});
}
async initialize() {
console.log('🔄 初始化市场分析器...');
await this.exchange.loadMarkets();
console.log(`✅ 加载了 ${this.exchange.symbols.length} 个交易对\n`);
}
async analyzeSymbol(symbol) {
try {
console.log(`📊 分析 ${symbol}:`);
// 获取行情数据
const ticker = await this.exchange.fetchTicker(symbol);
// 获取订单簿
const orderbook = await this.exchange.fetchOrderBook(symbol, 5);
// 基础分析
const analysis = {
symbol: symbol,
price: ticker.last,
change24h: ticker.percentage,
volume24h: ticker.baseVolume,
spread: orderbook.asks[0][0] - orderbook.bids[0][0],
spreadPercent: ((orderbook.asks[0][0] - orderbook.bids[0][0]) / orderbook.bids[0][0] * 100),
bidDepth: orderbook.bids.reduce((sum, bid) => sum + bid[1], 0),
askDepth: orderbook.asks.reduce((sum, ask) => sum + ask[1], 0),
};
// 显示分析结果
console.log(` 价格: $${analysis.price}`);
console.log(` 24h涨跌: ${analysis.change24h?.toFixed(2)}%`);
console.log(` 24h成交量: ${analysis.volume24h?.toFixed(2)}`);
console.log(` 价差: $${analysis.spread.toFixed(2)} (${analysis.spreadPercent.toFixed(4)}%)`);
console.log(` 买卖盘比: ${(analysis.bidDepth / analysis.askDepth).toFixed(2)}`);
// 简单评级
let rating = '中性';
if (analysis.change24h > 5) rating = '强势上涨';
else if (analysis.change24h > 2) rating = '温和上涨';
else if (analysis.change24h < -5) rating = '强势下跌';
else if (analysis.change24h < -2) rating = '温和下跌';
console.log(` 评级: ${rating}\n`);
return analysis;
} catch (error) {
console.error(`❌ 分析 ${symbol} 失败:`, error.message);
return null;
}
}
async analyzeTrends() {
const symbols = ['BTC/USDT', 'ETH/USDT', 'BNB/USDT', 'ADA/USDT', 'DOT/USDT'];
const results = [];
for (const symbol of symbols) {
const analysis = await this.analyzeSymbol(symbol);
if (analysis) {
results.push(analysis);
}
// 避免频率限制
await this.exchange.sleep(this.exchange.rateLimit);
}
// 市场总结
console.log('📈 市场总结:');
const avgChange = results.reduce((sum, r) => sum + (r.change24h || 0), 0) / results.length;
const upCount = results.filter(r => (r.change24h || 0) > 0).length;
const downCount = results.filter(r => (r.change24h || 0) < 0).length;
console.log(`平均涨跌幅: ${avgChange.toFixed(2)}%`);
console.log(`上涨品种: ${upCount} 个`);
console.log(`下跌品种: ${downCount} 个`);
console.log(`市场情绪: ${avgChange > 0 ? '乐观' : '悲观'}`);
return results;
}
}
// 使用示例
async function runAnalysis() {
const analyzer = new MarketAnalyzer();
await analyzer.initialize();
await analyzer.analyzeTrends();
}
runAnalysis().catch(console.error);
🎯 学习检查点
完成本章后,您应该能够:
✅ 理解核心概念
- [ ] 知道什么是 Exchange、Symbol、Market、Ticker
- [ ] 理解订单簿的结构和含义
- [ ] 掌握交易对的命名规则
✅ 创建和配置交易所实例
- [ ] 能够实例化不同的交易所
- [ ] 了解主要配置选项的作用
- [ ] 知道如何设置 API 认证
✅ 编写基础程序
- [ ] 获取市场信息
- [ ] 获取实时行情数据
- [ ] 获取订单簿数据
- [ ] 进行简单的市场分析
🔗 下一步
现在您已经掌握了 CCXT 的基础概念和基本使用方法,接下来可以:
记住:在进行真实交易之前,请务必在沙盒环境中充分测试您的代码!
下一章:市场数据获取