Skip to content

第二章:基础概念与快速开始

🎯 核心概念详解

在开始使用 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 的基础概念和基本使用方法,接下来可以:

  1. 深入学习市场数据 - 了解更多市场数据获取方法
  2. 学习账户和交易 - 开始进行真实的交易操作
  3. 探索实时数据 - 使用 WebSocket 获取实时数据

记住:在进行真实交易之前,请务必在沙盒环境中充分测试您的代码!


下一章:市场数据获取

基于 VitePress 构建的现代化知识库