You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为异步类方法根据交易所动态应用限流装饰器

动态为CCXT异步方法应用对应交易所的限流装饰器

解决方案思路

通过在类初始化阶段动态绑定限流装饰器,结合交易所-限流规则的映射字典,实现根据实例化时传入的exchange_name自动匹配对应限流策略,同时优化交易所实例的创建逻辑,避免固定写死。

修改后的完整代码

import ccxt.async_support as ccxt
from limiter import Limiter

# 建立交易所与限流规则的映射,便于后续扩展新交易所
exchange_limiters = {
    "binance": Limiter(rate=19, capacity=19, consume=1),
    "coinbase": Limiter(rate=3, capacity=3, consume=1)
}

class CCXTFeed:
    def __init__(self, exchange_name):
        # 动态创建对应交易所的异步实例(统一转小写兼容输入)
        self._exchange = getattr(ccxt, exchange_name.lower())()
        self._exchange_name = exchange_name.lower()
        
        # 获取当前交易所对应的限流装饰器
        limiter = exchange_limiters.get(self._exchange_name)
        if not limiter:
            raise ValueError(f"不支持的交易所:{exchange_name}")
        
        # 动态将限流装饰器应用到私有方法上
        self.__FetchSymbolOHLCChunk = limiter(self.__FetchSymbolOHLCChunk)

    async def __FetchSymbolOHLCChunk(self, symbol, timeframe, startTime, limit=1000):
        data = await self._exchange.fetch_ohlcv(symbol, timeframe, since=startTime, limit=limit)
        return data

关键说明

  1. 映射字典管理限流规则:把交易所名称和对应的Limiter实例存在exchange_limiters字典里,后续新增交易所只需添加新的键值对,无需修改类的核心逻辑。
  2. 动态创建交易所实例:用getattr(ccxt, exchange_name.lower())()替代固定的ccxt.binance(),支持传入任意CCXT支持的交易所名称(大小写不敏感)。
  3. 动态绑定装饰器:在__init__中获取对应限流装饰器后,直接将原方法替换为被装饰后的版本,确保后续调用该方法时自动触发限流逻辑。

使用示例

# 创建Binance数据源实例,自动应用Binance的限流规则
binance_feed = CCXTFeed("binance")
# 创建Coinbase数据源实例,自动应用Coinbase的限流规则
coinbase_feed = CCXTFeed("coinbase")

内容的提问来源于stack exchange,提问作者shda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:47:53