Trong hành trình xây dựng hệ thống giao dịch tự động, đội ngũ của tôi đã trải qua 18 tháng vật lộn với việc quản lý API từ 5 sàn giao dịch khác nhau. Mỗi sàn có cách xác thực riêng, giới hạn tốc độ khác nhau, và cấu trúc phản hồi không tương thích. Khi chúng tôi chuyển sang HolySheep AI — bộ tổng hợp API đa mô hình với tỷ giá chỉ ¥1=$1 — toàn bộ kiến trúc đã thay đổi. Bài viết này là playbook chi tiết về cách tôi xây dựng hệ thống tổng hợp API đa sàn, triển khai backtest chiến lược, và đo lường ROI thực tế.

Tại Sao Đội Ngũ Của Tôi Rời Bỏ API Chính Thức

Trước khi đi vào chi tiết kỹ thuật, tôi muốn chia sẻ lý do thực tế khiến chúng tôi phải tìm giải pháp thay thế. Với 5 sàn giao dịch (Binance, Coinbase, Kraken, OKX, Bybit), mỗi ngày đội ngũ phải đối mặt với:

Kiến Trúc Hệ Thống Tổng Hợp API Đa Sàn

Kiến trúc tôi xây dựng bao gồm 4 layer chính, mỗi layer đảm nhiệm một chức năng riêng biệt và giao tiếp qua message queue để đảm bảo decoupling hoàn toàn.

Layer 1: Gateway Adapter

Layer này chịu trách nhiệm chuẩn hóa request từ client và chuyển đổi sang format mà HolySheep AI có thể xử lý. Điểm mấu chốt là chúng ta không cần viết adapter cho từng sàn — HolySheep đã làm điều đó.

# Layer 1: Gateway Adapter - Chuẩn hóa request
import aiohttp
import asyncio
from typing import Dict, Any, Optional
from dataclasses import dataclass
from enum import Enum
import hashlib
import time

class Exchange(Enum):
    BINANCE = "binance"
    COINBASE = "coinbase"
    KRAKEN = "kraken"
    OKX = "okx"
    BYBIT = "bybit"

@dataclass
class NormalizedRequest:
    exchange: Exchange
    endpoint: str
    method: str
    params: Dict[str, Any]
    timestamp: int

@dataclass
class NormalizedResponse:
    exchange: Exchange
    status: int
    data: Any
    latency_ms: float
    cost_credits: float

class GatewayAdapter:
    def __init__(self, holysheep_api_key: str):
        self.base_url = "https://api.holysheep.ai/v1"
        self.api_key = holysheep_api_key
        self.session: Optional[aiohttp.ClientSession] = None
        
    async def initialize(self):
        """Khởi tạo aiohttp session với connection pooling"""
        connector = aiohttp.TCPConnector(
            limit=100,
            limit_per_host=20,
            ttl_dns_cache=300
        )
        self.session = aiohttp.ClientSession(
            connector=connector,
            timeout=aiohttp.ClientTimeout(total=30)
        )
    
    async def close(self):
        """Đóng session và giải phóng tài nguyên"""
        if self.session:
            await self.session.close()
    
    def normalize_binance_request(self, raw_params: Dict) -> NormalizedRequest:
        """Chuẩn hóa request từ format Binance"""
        return NormalizedRequest(
            exchange=Exchange.BINANCE,
            endpoint="/api/v3/account",
            method="GET",
            params=raw_params,
            timestamp=int(time.time() * 1000)
        )
    
    def normalize_coinbase_request(self, raw_params: Dict) -> NormalizedRequest:
        """Chuẩn hóa request từ format Coinbase"""
        return NormalizedRequest(
            exchange=Exchange.COINBASE,
            endpoint="/accounts",
            method="GET",
            params=raw_params,
            timestamp=int(time.time() * 1000)
        )
    
    async def send_to_holysheep(self, request: NormalizedRequest) -> NormalizedResponse:
        """
        Gửi request đã chuẩn hóa đến HolySheep AI Gateway
        HolySheep xử lý tất cả các sàn qua một endpoint duy nhất
        """
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json",
            "X-Exchange": request.exchange.value,
            "X-Request-ID": hashlib.md5(
                f"{request.exchange.value}{request.timestamp}".encode()
            ).hexdigest()
        }
        
        payload = {
            "action": "exchange_api",
            "exchange": request.exchange.value,
            "endpoint": request.endpoint,
            "method": request.method,
            "params": request.params,
            "options": {
                "priority": "high",
                "cache_ttl": 1000,
                "retry_count": 3
            }
        }
        
        start_time = time.perf_counter()
        
        async with self.session.post(
            f"{self.base_url}/aggregate",
            headers=headers,
            json=payload
        ) as response:
            data = await response.json()
            latency = (time.perf_counter() - start_time) * 1000
            
            return NormalizedResponse(
                exchange=request.exchange,
                status=response.status,
                data=data,
                latency_ms=latency,
                cost_credits=data.get("credits_used", 0.001)
            )

Sử dụng

async def main(): adapter = GatewayAdapter("YOUR_HOLYSHEEP_API_KEY") await adapter.initialize() try: # Chuẩn hóa request từ Binance binance_req = adapter.normalize_binance_request({ "symbol": "BTCUSDT", "timestamp": int(time.time() * 1000) }) # Gửi qua HolySheep - không cần lo về signature hay rate limit response = await adapter.send_to_holysheep(binance_req) print(f"Latency: {response.latency_ms:.2f}ms") print(f"Credits used: {response.cost_credits}") finally: await adapter.close() asyncio.run(main())

Layer 2: Rate Limiter & Circuit Breaker

Thay vì quản lý rate limit cho từng sàn riêng biệt, chúng ta sử dụng token bucket algorithm với HolySheep như một proxy trung tâm. HolySheep tự động handle rate limiting và cung cấp circuit breaker để ngăn cascade failure.

# Layer 2: Rate Limiter với Token Bucket và Circuit Breaker
import asyncio
from collections import defaultdict
from datetime import datetime, timedelta
from typing import Dict, Callable, Any
import logging

class TokenBucket:
    """Token Bucket algorithm cho rate limiting thích ứng"""
    
    def __init__(self, capacity: int, refill_rate: float):
        self.capacity = capacity
        self.tokens = capacity
        self.refill_rate = refill_rate  # tokens/second
        self.last_refill = datetime.now()
    
    async def acquire(self, tokens_needed: int = 1) -> bool:
        """Acquire tokens với blocking nếu cần"""
        while True:
            self._refill()
            
            if self.tokens >= tokens_needed:
                self.tokens -= tokens_needed
                return True
            
            # Tính thời gian chờ
            tokens_deficit = tokens_needed - self.tokens
            wait_time = tokens_deficit / self.refill_rate
            await asyncio.sleep(wait_time)
    
    def _refill(self):
        """Refill tokens dựa trên thời gian đã trôi qua"""
        now = datetime.now()
        elapsed = (now - self.last_refill).total_seconds()
        self.tokens = min(
            self.capacity,
            self.tokens + elapsed * self.refill_rate
        )
        self.last_refill = now

class CircuitBreaker:
    """Circuit Breaker pattern để ngăn cascade failure"""
    
    def __init__(
        self,
        failure_threshold: int = 5,
        recovery_timeout: int = 60,
        half_open_requests: int = 3
    ):
        self.failure_threshold = failure_threshold
        self.recovery_timeout = recovery_timeout
        self.half_open_requests = half_open_requests
        
        self.failure_count = 0
        self.last_failure_time: datetime = None
        self.state = "CLOSED"  # CLOSED, OPEN, HALF_OPEN
        
    def record_success(self):
        """Ghi nhận request thành công"""
        self.failure_count = 0
        if self.state == "HALF_OPEN":
            self.state = "CLOSED"
            logging.info("Circuit breaker CLOSED - Service recovered")
    
    def record_failure(self):
        """Ghi nhận request thất bại"""
        self.failure_count += 1
        self.last_failure_time = datetime.now()
        
        if self.failure_count >= self.failure_threshold:
            self.state = "OPEN"
            logging.warning(
                f"Circuit breaker OPEN - Too many failures: {self.failure_count}"
            )
    
    async def call(self, func: Callable, *args, **kwargs) -> Any:
        """Execute function với circuit breaker protection"""
        
        if self.state == "OPEN":
            if self._should_attempt_reset():
                self.state = "HALF_OPEN"
                logging.info("Circuit breaker entering HALF_OPEN state")
            else:
                raise CircuitBreakerOpenError(
                    f"Circuit breaker is OPEN. Retry after "
                    f"{(self.recovery_timeout - self._time_since_failure())}s"
                )
        
        try:
            result = await func(*args, **kwargs)
            self.record_success()
            return result
        except Exception as e:
            self.record_failure()
            raise
    
    def _should_attempt_reset(self) -> bool:
        """Kiểm tra xem có nên thử reset circuit breaker không"""
        if self.last_failure_time is None:
            return True
        return self._time_since_failure() >= self.recovery_timeout
    
    def _time_since_failure(self) -> float:
        """Tính thời gian kể từ lần thất bại cuối"""
        if self.last_failure_time is None:
            return float('inf')
        return (datetime.now() - self.last_failure_time).total_seconds()

class RateLimiterManager:
    """Quản lý rate limit cho tất cả sàn qua HolySheep"""
    
    def __init__(self):
        # HolySheep cung cấp unified rate limit
        # Không cần quản lý riêng cho từng sàn
        self.unified_bucket = TokenBucket(
            capacity=1000,  # 1000 requests
            refill_rate=100  # 100 requests/second
        )
        
        # Circuit breakers cho từng sàn
        self.circuit_breakers: Dict[str, CircuitBreaker] = defaultdict(
            lambda: CircuitBreaker()
        )
        
        self.request_counts: Dict[str, int] = defaultdict(int)
        self.cost_tracker: Dict[str, float] = defaultdict(float)
    
    async def execute_request(
        self,
        exchange: str,
        func: Callable,
        *args, **kwargs
    ) -> Any:
        """Execute request với rate limiting và circuit breaker"""
        
        # Acquire token từ unified bucket
        await self.unified_bucket.acquire()
        
        circuit_breaker = self.circuit_breakers[exchange]
        result = await circuit_breaker.call(func, *args, **kwargs)
        
        # Track metrics
        self.request_counts[exchange] += 1
        
        return result
    
    def get_stats(self) -> Dict[str, Any]:
        """Lấy thống kê rate limiting"""
        total_requests = sum(self.request_counts.values())
        total_cost = sum(self.cost_tracker.values())
        
        return {
            "total_requests": total_requests,
            "requests_by_exchange": dict(self.request_counts),
            "total_cost_usd": total_cost,
            "cost_per_1k_requests": (total_cost / total_requests * 1000) 
                if total_requests > 0 else 0,
            "circuit_breaker_states": {
                exchange: cb.state 
                for exchange, cb in self.circuit_breakers.items()
            }
        }

Ví dụ sử dụng

async def example_usage(): limiter = RateLimiterManager() async def fetch_binance_price(symbol: str): # Logic gọi HolySheep API pass try: result = await limiter.execute_request( "binance", fetch_binance_price, "BTCUSDT" ) stats = limiter.get_stats() print(f"Total requests: {stats['total_requests']}") print(f"Cost per 1K requests: ${stats['cost_per_1k_requests']:.4f}") except CircuitBreakerOpenError as e: print(f"Service unavailable: {e}") class CircuitBreakerOpenError(Exception): pass

Framework Backtest Chiến Lược Giao Dịch

Phần quan trọng nhất của hệ thống là framework backtest cho phép kiểm tra chiến lược trên dữ liệu lịch sử trước khi deploy. Tôi xây dựng framework này với khả năng mô phỏng chính xác điều kiện thị trường thực tế, bao gồm slippage, phí giao dịch, và độ trễ.

Core Backtest Engine

# Framework Backtest Chiến Lược Giao Dịch
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from typing import List, Dict, Any, Callable, Optional
from dataclasses import dataclass, field
from enum import Enum
from collections import deque
import json

class OrderType(Enum):
    MARKET = "market"
    LIMIT = "limit"
    STOP_LOSS = "stop_loss"
    TAKE_PROFIT = "take_profit"

class OrderSide(Enum):
    BUY = "buy"
    SELL = "sell"

@dataclass
class Order:
    order_id: str
    timestamp: datetime
    symbol: str
    side: OrderSide
    order_type: OrderType
    quantity: float
    price: Optional[float] = None
    filled_price: Optional[float] = None
    status: str = "pending"
    fees: float = 0.0

@dataclass
class Position:
    symbol: str
    quantity: float
    entry_price: float
    current_price: float
    unrealized_pnl: float = 0.0
    realized_pnl: float = 0.0

@dataclass
class BacktestConfig:
    initial_capital: float = 10000.0
    commission_rate: float = 0.001  # 0.1% per trade
    slippage_rate: float = 0.0005   # 0.05% slippage
    maker_fee: float = 0.001
    taker_fee: float = 0.002
    min_trade_amount: float = 10.0

@dataclass
class BacktestResult:
    total_trades: int = 0
    winning_trades: int = 0
    losing_trades: int = 0
    total_pnl: float = 0.0
    max_drawdown: float = 0.0
    sharpe_ratio: float = 0.0
    win_rate: float = 0.0
    avg_profit: float = 0.0
    avg_loss: float = 0.0
    profit_factor: float = 0.0
    equity_curve: List[float] = field(default_factory=list)
    trades_log: List[Order] = field(default_factory=list)

class BacktestEngine:
    """
    Engine backtest với mô phỏng chính xác điều kiện thực tế
    """
    
    def __init__(self, config: BacktestConfig):
        self.config = config
        self.capital = config.initial_capital
        self.initial_capital = config.initial_capital
        self.positions: Dict[str, Position] = {}
        self.orders_history: List[Order] = []
        self.equity_curve = [config.initial_capital]
        self.order_counter = 0
        
        # Stats tracking
        self.trade_pnls = []
        self.daily_returns = []
        
    def reset(self):
        """Reset engine về trạng thái ban đầu"""
        self.capital = self.config.initial_capital
        self.positions = {}
        self.orders_history = []
        self.equity_curve = [self.config.initial_capital]
        self.trade_pnls = []
        self.daily_returns = []
        
    def _generate_order_id(self) -> str:
        self.order_counter += 1
        return f"BK{self.order_counter:06d}"
    
    def _apply_slippage(self, price: float, side: OrderSide) -> float:
        """Áp dụng slippage mô phỏng điều kiện thực tế"""
        slippage = price * self.config.slippage_rate
        if side == OrderSide.BUY:
            return price * (1 + slippage)
        else:
            return price * (1 - slippage)
    
    def _calculate_fees(self, order: Order) -> float:
        """Tính phí giao dịch dựa trên loại order"""
        if order.order_type == OrderType.MARKET:
            return order.filled_price * order.quantity * self.config.taker_fee
        else:
            return order.filled_price * order.quantity * self.config.maker_fee
    
    def place_order(
        self,
        timestamp: datetime,
        symbol: str,
        side: OrderSide,
        quantity: float,
        order_type: OrderType = OrderType.MARKET,
        limit_price: Optional[float] = None
    ) -> Order:
        """Đặt order với mô phỏng chính xác"""
        
        order = Order(
            order_id=self._generate_order_id(),
            timestamp=timestamp,
            symbol=symbol,
            side=side,
            order_type=order_type,
            quantity=quantity,
            price=limit_price
        )
        
        # Mô phỏng filled price với slippage
        current_price = self._get_current_price(symbol, timestamp)
        filled_price = self._apply_slippage(current_price, side)
        order.filled_price = filled_price
        
        # Tính fees
        order.fees = self._calculate_fees(order)
        
        # Execute order
        self._execute_order(order)
        self.orders_history.append(order)
        
        return order
    
    def _execute_order(self, order: Order):
        """Thực thi order và cập nhật portfolio"""
        
        if order.side == OrderSide.BUY:
            total_cost = order.filled_price * order.quantity + order.fees
            
            if total_cost > self.capital:
                order.status = "rejected"
                return
            
            self.capital -= total_cost
            
            if order.symbol in self.positions:
                pos = self.positions[order.symbol]
                # Tính giá trung bình mới
                total_value = pos.quantity * pos.entry_price + order.quantity * order.filled_price
                total_quantity = pos.quantity + order.quantity
                pos.entry_price = total_value / total_quantity
                pos.quantity = total_quantity
            else:
                self.positions[order.symbol] = Position(
                    symbol=order.symbol,
                    quantity=order.quantity,
                    entry_price=order.filled_price,
                    current_price=order.filled_price
                )
            
            order.status = "filled"
            
        else:  # SELL
            if order.symbol not in self.positions:
                order.status = "rejected"
                return
            
            pos = self.positions[order.symbol]
            if pos.quantity < order.quantity:
                order.status = "rejected"
                return
            
            proceeds = order.filled_price * order.quantity - order.fees
            self.capital += proceeds
            
            # Tính PnL
            pnl = proceeds - (pos.entry_price * order.quantity)
            self.trade_pnls.append(pnl)
            
            pos.quantity -= order.quantity
            if pos.quantity <= 0:
                del self.positions[order.symbol]
            
            order.status = "filled"
        
        # Cập nhật equity
        self._update_equity()
    
    def _get_current_price(self, symbol: str, timestamp: datetime) -> float:
        """Lấy giá từ dữ liệu history (sẽ implement trong subclass)"""
        # Override trong implementation thực tế
        return 0.0
    
    def _update_equity(self):
        """Cập nhật equity curve"""
        position_value = sum(
            pos.quantity * pos.current_price 
            for pos in self.positions.values()
        )
        total_equity = self.capital + position_value
        self.equity_curve.append(total_equity)
    
    def calculate_results(self) -> BacktestResult:
        """Tính toán kết quả backtest"""
        
        result = BacktestResult()
        result.total_trades = len(self.orders_history)
        result.trades_log = self.orders_history
        
        winning_trades = [p for p in self.trade_pnls if p > 0]
        losing_trades = [p for p in self.trade_pnls if p <= 0]
        
        result.winning_trades = len(winning_trades)
        result.losing_trades = len(losing_trades)
        
        if self.trade_pnls:
            result.total_pnl = sum(self.trade_pnls)
            result.win_rate = len(winning_trades) / len(self.trade_pnls)
            result.avg_profit = np.mean(winning_trades) if winning_trades else 0
            result.avg_loss = abs(np.mean(losing_trades)) if losing_trades else 0
            result.profit_factor = (
                sum(winning_trades) / abs(sum(losing_trades))
                if losing_trades and sum(losing_trades) != 0 else 0
            )
        
        # Max drawdown
        equity = np.array(self.equity_curve)
        running_max = np.maximum.accumulate(equity)
        drawdown = (equity - running_max) / running_max
        result.max_drawdown = abs(np.min(drawdown))
        
        # Sharpe ratio
        if len(self.daily_returns) > 1:
            result.sharpe_ratio = np.mean(self.daily_returns) / np.std(self.daily_returns) * np.sqrt(252)
        
        result.equity_curve = self.equity_curve
        
        return result
    
    def print_summary(self, result: BacktestResult):
        """In tóm tắt kết quả"""
        print("=" * 50)
        print("BACKTEST RESULTS")
        print("=" * 50)
        print(f"Total Trades:      {result.total_trades}")
        print(f"Win Rate:          {result.win_rate:.2%}")
        print(f"Total PnL:         ${result.total_pnl:.2f}")
        print(f"Max Drawdown:      {result.max_drawdown:.2%}")
        print(f"Sharpe Ratio:      {result.sharpe_ratio:.2f}")
        print(f"Profit Factor:     {result.profit_factor:.2f}")
        print(f"Avg Profit:        ${result.avg_profit:.2f}")
        print(f"Avg Loss:          ${result.avg_loss:.2f}")
        print(f"Final Capital:     ${self.equity_curve[-1]:.2f}")
        print("=" * 50)

Ví dụ sử dụng

async def run_sample_backtest(): config = BacktestConfig( initial_capital=10000.0, commission_rate=0.001, slippage_rate=0.0005 ) engine = BacktestEngine(config) # Simulate 100 trades base_price = 50000.0 for i in range(100): timestamp = datetime.now() - timedelta(days=100-i) price = base_price + np.random.randn() * 1000 # Simple moving average crossover strategy if i % 2 == 0: engine.place_order( timestamp=timestamp, symbol="BTCUSDT", side=OrderSide.BUY, quantity=0.01 ) else: if "BTCUSDT" in engine.positions: engine.place_order( timestamp=timestamp, symbol="BTCUSDT", side=OrderSide.SELL, quantity=0.01 ) result = engine.calculate_results() engine.print_summary(result) return result

Tích Hợp HolySheep AI Vào Hệ Thống

Sau khi xây dựng kiến trúc cơ bản, bước quan trọng nhất là tích hợp HolySheep AI để lấy dữ liệu thị trường real-time và historical. HolySheep cung cấp unified endpoint cho tất cả các sàn, với latency trung bình dưới 50ms và chi phí chỉ ¥1 cho mỗi đô la Mỹ tiêu thụ.

# Tích hợp HolySheep AI cho dữ liệu thị trường
import aiohttp
import asyncio
import pandas as pd
from datetime import datetime, timedelta
from typing import List, Dict, Optional, Any
import json

class HolySheepMarketData:
    """
    Client lấy dữ liệu thị trường từ HolySheep AI
    Tất cả các sàn giao dịch qua một endpoint duy nhất
    """
    
    def __init__(self, api_key: str):
        self.base_url = "https://api.holysheep.ai/v1"
        self.api_key = api_key
        self.session: Optional[aiohttp.ClientSession] = None
        
    async def __aenter__(self):
        connector = aiohttp.TCPConnector(limit=50)
        self.session = aiohttp.ClientSession(
            connector=connector,
            timeout=aiohttp.ClientTimeout(total=30)
        )
        return self
    
    async def __aexit__(self, exc_type, exc_val, exc_tb):
        if self.session:
            await self.session.close()
    
    def _get_headers(self) -> Dict[str, str]:
        return {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
    
    async def get_realtime_price(
        self,
        exchange: str,
        symbol: str
    ) -> Dict[str, Any]:
        """
        Lấy giá real-time từ sàn giao dịch
        Latency target: <50ms
        """
        payload = {
            "action": "market_price",
            "exchange": exchange,
            "symbol": symbol,
            "options": {
                "return_format": "normalized"
            }
        }
        
        async with self.session.post(
            f"{self.base_url}/market",
            headers=self._get_headers(),
            json=payload
        ) as response:
            data = await response.json()
            return {
                "symbol": data["symbol"],
                "price": float(data["price"]),
                "bid": float(data["bid"]),
                "ask": float(data["ask"]),
                "volume_24h": float(data["volume_24h"]),
                "timestamp": data["timestamp"]
            }
    
    async def get_klines(
        self,
        exchange: str,
        symbol: str,
        interval: str = "1h",
        start_time: Optional[datetime] = None,
        end_time: Optional[datetime] = None,
        limit: int = 1000
    ) -> pd.DataFrame:
        """
        Lấy dữ liệu OHLCV từ HolySheep
        Hỗ trợ tất cả các sàn qua unified interface
        """
        params = {
            "action": "klines",
            "exchange": exchange,
            "symbol": symbol,
            "interval": interval,
            "limit": limit
        }
        
        if start_time:
            params["start_time"] = int(start_time.timestamp() * 1000)
        if end_time:
            params["end_time"] = int(end_time.timestamp() * 1000)
        
        async with self.session.post(
            f"{self.base_url}/market",
            headers=self._get_headers(),
            json=params
        ) as response:
            data = await response.json()
            
            # Chuyển đổi sang DataFrame với format chuẩn
            df = pd.DataFrame(data["klines"])
            
            # Rename columns sang format chuẩn
            df.columns = [
                "timestamp", "open", "high", "low", "close", "volume", "close_time"
            ]
            
            # Convert timestamp
            df["timestamp"] = pd.to_datetime(df["timestamp"], unit="ms")
            df["close_time"] = pd.to_datetime(df["close_time"], unit="ms")
            
            # Convert sang numeric
            for col in ["open", "high", "low", "close", "volume"]:
                df[col] = pd.to_numeric(df[col])
            
            return df
    
    async def get_orderbook(
        self,
        exchange: str,
        symbol: str,
        depth: int = 20
    ) -> Dict[str, Any]:
        """Lấy orderbook từ sàn giao dịch"""
        payload = {
            "action": "orderbook",
            "exchange": exchange,
            "symbol": symbol,
            "depth": depth
        }
        
        async with self.session.post(
            f"{self.base_url}/market",
            headers=self._get_headers(),
            json=payload
        ) as response:
            return await response.json()
    
    async def get_ticker_24h(
        self,
        exchange: str,
        symbol: Optional[str] = None
    ) -> List[Dict[str, Any]]:
        """Lấy ticker 24h cho tất cả các cặp hoặc cặp cụ thể"""
        payload = {
            "action": "ticker_24h",
            "exchange": exchange
        }
        
        if symbol:
            payload["symbol"] = symbol
        
        async with self.session.post(
            f"{self.base_url}/market",
            headers=self._get_headers(),
            json=payload
        ) as response:
            data = await response.json()
            return data.get("tickers", [])

class MultiExchangeDataFetcher:
    """
    F