Dos estrategias que no necesitan predecir la dirección ” solo aprovechar la ineficiencia del mercado
import ccxt.async_support as ccxt import asyncio async def scan_arbitrage(symbol='BTC/USDT'): exchanges = { 'binance': ccxt.binance({'enableRateLimit': True}), 'kraken' : ccxt.kraken({'enableRateLimit': True}), 'coinbase': ccxt.coinbase({'enableRateLimit': True}), } # Fetch all orderbooks concurrently tickers = await asyncio.gather(*[ ex.fetch_ticker(symbol) for ex in exchanges.values() ]) prices = {name: t['last'] for name,t in zip(exchanges, tickers)} best_buy = min(prices, key=prices.get) best_sell = max(prices, key=prices.get) spread_pct = (prices[best_sell] - prices[best_buy]) / prices[best_buy] * 100 total_fee = 0.1 * 2 # buy + sell fee net_profit_pct = spread_pct - total_fee if net_profit_pct > 0.05: # mínimo viable execute_arbitrage(best_buy, best_sell, symbol, capital) return {'spread': spread_pct, 'net': net_profit_pct}
class GridBot: def __init__(self, symbol, center, range_pct, levels, capital, fee=0.001): self.symbol = symbol self.capital = capital self.fee = fee step = center * range_pct / levels self.buy_levels = [center - step * i for i in range(1, levels+1)] self.sell_levels = [center + step * i for i in range(1, levels+1)] self.capital_per_level = capital / levels def on_tick(self, price): for lvl in self.buy_levels: if price <= lvl and lvl not in self.open_buys: qty = self.capital_per_level / (lvl * (1 + self.fee)) self.place_order('BUY', qty, lvl) for lvl in self.sell_levels: if price >= lvl and lvl not in self.open_sells: self.place_order('SELL', self.holdings.get(lvl, 0), lvl)