为异步类方法根据交易所动态应用限流装饰器
动态为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
关键说明
- 映射字典管理限流规则:把交易所名称和对应的
Limiter实例存在exchange_limiters字典里,后续新增交易所只需添加新的键值对,无需修改类的核心逻辑。 - 动态创建交易所实例:用
getattr(ccxt, exchange_name.lower())()替代固定的ccxt.binance(),支持传入任意CCXT支持的交易所名称(大小写不敏感)。 - 动态绑定装饰器:在
__init__中获取对应限流装饰器后,直接将原方法替换为被装饰后的版本,确保后续调用该方法时自动触发限流逻辑。
使用示例
# 创建Binance数据源实例,自动应用Binance的限流规则 binance_feed = CCXTFeed("binance") # 创建Coinbase数据源实例,自动应用Coinbase的限流规则 coinbase_feed = CCXTFeed("coinbase")
内容的提问来源于stack exchange,提问作者shda
相关产品推荐
相关产品推荐

