Este proyecto ya incluye integración base de Firebase para:
- Auth con Google
- Storage para subida de archivos
- Sesión de Firebase registrada y validada en Prisma
Copia .env.example a .env.local y completa los valores de tu proyecto Firebase.
cp .env.example .env.localVariables usadas:
NEXT_FIREBASE_API_KEY=
NEXT_FIREBASE_AUTH_DOMAIN=
NEXT_FIREBASE_PROJECT_ID=
NEXT_FIREBASE_STORAGE_BUCKET=
NEXT_FIREBASE_MESSAGING_SENDER_ID=
NEXT_FIREBASE_APP_ID=
NEXT_FIREBASE_MEASUREMENT_ID=
FIREBASE_PROJECT_ID=
FIREBASE_CLIENT_EMAIL=
FIREBASE_PRIVATE_KEY=
DATABASE_URL=- Crea un proyecto en Firebase.
- En
Authentication > Sign-in method, habilitaGoogle. - En
Storage, crea el bucket. - En
Project settings > Your apps > Web app, copia las credenciales públicas. - En
Project settings > Service accounts, genera una clave privada paraFIREBASE_CLIENT_EMAILyFIREBASE_PRIVATE_KEY.
Usa reglas de Storage que limiten acceso por usuario autenticado:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{allPaths=**} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
}
}pnpm devAbre http://localhost:3000 y haz click en davalbra en el navbar para abrir el modal de acceso con Google.
El proyecto ya incluye Prisma con PostgreSQL:
- Config principal:
prisma.config.ts - Esquema:
prisma/schema.prisma - Cliente compartido:
lib/prisma.ts
Comandos disponibles:
pnpm prisma:validate
pnpm prisma:format
pnpm prisma:generate
pnpm prisma:migrate
pnpm prisma:push
pnpm prisma:studioNota: antes de usar migraciones o db push, revisa que DATABASE_URL apunte a la base correcta.
El login con Firebase puede restringirse por una whitelist en base de datos.
Tablas nuevas:
configuracion_acceso: flag global.correos_autorizados: correos permitidos.
Flujo:
- Si
requerirListaCorreos = false, entra cualquier usuario autenticado. - Si
requerirListaCorreos = true, solo entran correos activos encorreos_autorizados. - Si el correo no está permitido, la API responde
403.
Desde Prisma Studio (pnpm prisma:studio) edita configuracion_acceso (id default) y activa:
requerirListaCorreos = true
Inserta filas en correos_autorizados con:
emailen minúsculasactivo = true
Además de la sesión Firebase y la whitelist por correo, el proyecto ahora valida rol mínimo por ruta.
Roles disponibles en Usuario.rol:
LECTOR(default)COLABORADORADMIN
Rutas protegidas por rol desde proxy.ts:
/dashboardrequiereCOLABORADORoADMIN/storage-testrequiereCOLABORADORoADMIN
Si un usuario autenticado no tiene rol suficiente, redirige a / con ?auth=forbidden.
Desde Prisma Studio (pnpm prisma:studio) en la tabla usuarios, edita el campo rol del usuario.
Se agregó una nueva sección en el panel: Billing, con dos apartados:
FirebaseGoogle Gemini API
Estos apartados leen costos reales desde el export de Cloud Billing en BigQuery.
Variables requeridas:
GOOGLE_BILLING_EXPORT_TABLE=mi-proyecto.billing.gcp_billing_export_v1_*
GOOGLE_BILLING_QUERY_PROJECT_ID=mi-proyecto
GOOGLE_BILLING_BQ_LOCATION=USNotas:
GOOGLE_BILLING_EXPORT_TABLEdebe apuntar a tu tabla/vista de export.- El service account usado por
FIREBASE_CLIENT_EMAILnecesita permisos de consulta en BigQuery (ejemplo:BigQuery Job User+BigQuery Data Viewer). - El billing export puede tener retraso, por lo que la vista no siempre es en tiempo real.
Se agregó un bot en scripts/binance-futures-bot.mjs que opera futuros USDT-M de Binance.
Sí. Binance Futures tiene Testnet con saldo virtual para paper trading.
- Usa
config/trading-futures.jsoncon"testnet": true - Mantén
"dryRun": truemientras validas lógica/sizing - Cuando quieras enviar órdenes de prueba en testnet, cambia
"dryRun": falsey usa credenciales de testnet
No existe una estrategia "más rentable" garantizada para todos los mercados. Para este proyecto se implementó una estrategia robusta de tipo trend-following con control de riesgo:
- Tendencia: cruce de
EMA rápida(BINANCE_FAST_EMA, default21) sobreEMA lenta(BINANCE_SLOW_EMA, default55). - Filtro de momentum con
RSI(BINANCE_RSI_PERIOD, default14):- Long: RSI entre
52y70 - Short: RSI entre
30y48
- Long: RSI entre
- Gestión de riesgo con
ATR(BINANCE_ATR_PERIOD, default14):- Stop Loss =
ATR * BINANCE_STOP_ATR_MULT(default1.5) - Take Profit =
ATR * BINANCE_TP_ATR_MULT(default3)
- Stop Loss =
- Tamaño de posición por riesgo fijo:
- Riesgo por trade =
balance * BINANCE_RISK_PER_TRADE(default1%).
- Riesgo por trade =
El bot evita abrir una operación si ya existe una posición abierta en el símbolo.
Ahora se separa así:
- Configuración no sensible:
config/trading-futures.json - Secretos:
.env.local
Variables de entorno de trading necesarias:
BINANCE_API_KEY=
BINANCE_API_SECRET=
TRADING_SCHEDULER_TOKEN=
CRON_SECRET=Ejemplo de configuración en archivo:
{
"binance": {
"testnet": true,
"dryRun": true,
"symbol": "BTCUSDT",
"interval": "15m",
"leverage": 5,
"riskPerTrade": 0.01
},
"scheduler": {
"intervalMinutes": 15,
"candlesForBacktesting": 500
}
}pnpm trading:futuresComportamiento:
"dryRun": true: calcula señal y tamaño de posición, pero no envía órdenes."dryRun": false: envía orden de entrada (MARKET) y crea protección conSTOP_MARKET+TAKE_PROFIT_MARKET.
Recomendación operativa:
- Probar primero con
"testnet": true. - Validar logs y sizing con
"dryRun": true. - Pasar a live solo después de backtesting y límites de riesgo definidos.
Se agregaron endpoints protegidos por sesión Firebase y rol COLABORADOR:
POST /api/trading/futures/runPOST /api/trading/futures/backtestPOST /api/trading/futures/indicatorsGET /api/trading/futures/history?limit=20GET /api/trading/futures/schedulerPUT /api/trading/futures/scheduler
Ejemplo payload para run:
{
"symbol": "BTCUSDT",
"interval": "15m",
"leverage": 5,
"riskPerTrade": 0.01,
"fastEma": 21,
"slowEma": 55,
"rsiPeriod": 14,
"atrPeriod": 14,
"stopAtrMult": 1.5,
"tpAtrMult": 3,
"dryRun": true,
"testnet": true,
"marginType": "ISOLATED",
"paperBalance": 1000
}Ejemplo payload para backtest:
{
"symbol": "BTCUSDT",
"interval": "15m",
"leverage": 5,
"riskPerTrade": 0.01,
"fastEma": 21,
"slowEma": 55,
"rsiPeriod": 14,
"atrPeriod": 14,
"stopAtrMult": 1.5,
"tpAtrMult": 3,
"testnet": true,
"marginType": "ISOLATED",
"paperBalance": 1000,
"candlesLimit": 500
}Nuevo panel disponible en:
/dashboard/trading/futures
Permite:
- Ejecutar
run(señal y sizing en vivo con opcióndry-run/live). - Ejecutar
backtesthistórico sobre velas de Binance. - Ver gráficas de indicadores:
Precio + EMA,RSI,ATR. - Ajustar parámetros de estrategia desde UI.
- Ver métricas (
win rate,ROI,max drawdown,profit factor), historial de ejecuciones y estado del scheduler.
Se agregó un scheduler persistente en Prisma:
- Configuración:
trading_futures_scheduler_config - Historial de runs:
trading_futures_run_history - Historial de backtests:
trading_futures_backtest_history
Endpoint cron:
POST /api/trading/futures/scheduler/run
Seguridad:
- Requiere
TRADING_SCHEDULER_TOKENoCRON_SECRETcomo Bearer token. - En Vercel, el cron se dispara cada minuto (
vercel.json) y el backend decide si ya tocó ejecutar segúnintervalMinutes.
Configúralo desde UI en /dashboard/trading/futures:
enabled: activa/desactiva schedulerintervalMinutes: cada cuántos minutos ejecutarrunInDryMode: dry/live del schedulertestnet: red del scheduler
Después de actualizar código/esquema, aplica tablas nuevas:
pnpm prisma:generate
pnpm prisma:push