Bot de DCA semanal para ETHUSDT y BTCUSDT con una venta LIMIT al +5% (configurable). Cada compra es una entidad independiente (Compra #N) y se vende completa (sin ventas parciales en la contabilidad del bot).
- PHP 8.1+ (probado con PHP 8.2)
- Extensiones PHP:
pdo_sqlite,curl - Cuenta Bybit con API key de Spot trading (sin retiros)
- Copia el ejemplo de entorno:
cp config/.env.example .env- Edita
.envy define:
BYBIT_API_KEYBYBIT_API_SECRETBYBIT_ACCOUNT_TYPE(recomendadoUNIFIED)- Opcional:
BUY_ENABLED=0para pausar compras nuevas sin frenar ventas/reconciliación - Opcional:
SELL_MARKUP_PCT,DCA_AMOUNT_USDT,DCA_INTERVAL_DAYS - Opcional:
SYMBOL_TRADE_ETH(defaultETHUSDT) - Opcional:
SYMBOL_TRADE_BTC(defaultBTCUSDT)
Configurar en .env (no commitear credenciales):
NOTIFY_ENABLED=1[email protected][email protected](o el usuario SMTP)NOTIFY_NO_FUNDS_LEAD_HOURS=24(aviso si falta USDT dentro de esa ventana antes del próximo DCA)NOTIFY_COOLDOWN_MINUTES=60(máximo 1 aviso por hora)SMTP_HOST,SMTP_PORT(default 587),SMTP_ENCRYPTION(starttls),SMTP_USER,SMTP_PASS
Test manual:
php bin/notify-test.php
php bin/notify-test.php --dry-runEventos notificados:
- Compra creada (cuando se coloca la orden de compra real)
- Venta ejecutada (cuando se completa la venta y se registra el profit)
- Sin USDT suficiente para comprar (con cooldown
NOTIFY_COOLDOWN_MINUTES) - Sin USDT suficiente para el próximo DCA (aviso “anticipado” dentro de
NOTIFY_NO_FUNDS_LEAD_HOURS, con frecuencia limitada porNOTIFY_COOLDOWN_MINUTES)
- Crea carpetas si hace falta (logs/lock/db se crean solos, pero recomendado):
mkdir -p db logs storagebalances NO es el balance real del exchange. Representa los fondos autorizados para operar con el bot.
Depósitos de USDT se reflejan con reconciliación (automática en bin/run.php y también manual si querés):
php bin/reconcile.php
php bin/reconcile.php --dry-run- El comando consulta el balance real en Bybit.
- Solo ajusta en positivo (si
bybit_usdt > bot_usdt). - Registra log y evento
RECONCILEenevents_log.
Cron único (órdenes + reconciliación de balances + avisos de fondos).
Corre cada 10 minutos:
*/10 * * * * cd /path/to/boringbot && php bin/run.php >> logs/cron.log 2>&1Incluye lock anti doble ejecución en storage/boringbot.lock.
Modo simulación:
php bin/run.php --dry-runEn --dry-run el bot no crea compras ni modifica el ledger; solo loguea qué haría.
php bin/status.php
php bin/status.php --id 3Muestra:
- Compras
BUYING/HOLDING/OPEN/SOLD - Detalle de compra #N
- Gap vs target (cuando está
OPEN) - Balances del bot (USDT/ETH/BTC)
- Cada
DCA_INTERVAL_DAYScompraDCA_AMOUNT_USDTdeETHUSDTyBTCUSDT(market buy por monto en USDT). - Si
BUY_ENABLED=0, no crea compras nuevas, pero sigue gestionando compras/ventas existentes. - Al completarse la compra: crea una orden
LIMIT SELLal+SELL_MARKUP_PCT. - Al completarse la venta:
100 USDTvuelven abalances.USDT(capital_pool).profit = sell_usdt - 100queda enbalances.USDTy se acumula como ganancia realizada.
- Opcional:
SELL_QTY_BUFFER(default0) resta un buffer de base asset al reintentar ventas enHOLDINGpara evitar "Insufficient balance".
- SQLite:
db/boringbot.sqlite - Schema:
db/schema.sql
bin/run.php— tick del bot (para cron)bin/reconcile.php— reconciliación USDT (depósitos)bin/status.php— estado y detallesrc/Exchange/BybitClient.php— cliente Bybit v5 (Spot)
Si clonás el repo dentro de public_html, bloqueá acceso web a src/, bin/, config/, db/, logs/, storage/ (incluye .env). Este repo incluye .htaccess para eso; aun así, lo ideal es apuntar el DocumentRoot a otra carpeta.
Este repo incluye .cpanel.yml para deployments automáticos desde cPanel → Git Version Control → Manage → Deploy.
- Editar
DEPLOYPATHdentro de.cpanel.ymlpara tu ruta del servidor. config/.envno se versiona; queda intacto en el servidor.
Hay un dashboard simple en /dashboard/ (solo lectura) con HTTP Basic Auth.
Configurar en .env:
DASHBOARD_USER(defaultadmin)DASHBOARD_PASS(obligatorio)
Para mostrar logs/dashboard en horario local, configurar:
BORINGBOT_TIMEZONE=America/Argentina/Buenos_Aires