🟢 Estado en vivo
Posición abierta
Última señal procesada
Estado workflows
-
AHS Trading Bot — Paper Mode
✅ ACTIVO
ID:
IiwO5LbmOzgHP1zq· Cron cada 4h -
AHS Daily Analysis — Gemini AI
⚠️ FALLANDO
ID:
r7xfYI6qXmdMdUzE· Cron diario 09 UTC · Bug en Code node "Construir Contexto AI" -
Trading Bot — Dashboard Data
✅ ACTIVO
ID:
PAvKiTp0DivnsZyv· Webhook readonly · Source de este dashboard
📊 Precio, Z-Score y RSI — últimas 50 señales
Triángulos rojos = donde el bot abrió un trade. Las zonas sombreadas en RSI/Z-Score marcan los umbrales de la estrategia AHS.
💼 Historial de trades
| # | Apertura (UTC) | Régimen | Entrada | Salida | Size $ | SL | TP1 | Razón salida | PnL $ | PnL % | Dur (h) | Estado |
|---|
📡 Señales recientes (últimas 30)
| Fecha (UTC) | Régimen | Tipo | Precio | Z-Score | RSI | EMA50 | EMA200 | ATR | Trade? |
|---|
🎯 Estrategia AHS — cómo funciona
AHS es una estrategia mean-reversion con filtro de régimen: opera reversiones en mercado alcista y queda en standby en bajistas. Cada vela cerrada de 4 horas el bot evalúa si hay condiciones para abrir, y revisa si las posiciones abiertas deben cerrarse por TP1, TP2 o Stop Loss.
1. Filtro de régimen
- BULL si
EMA50 > EMA200→ el bot puede abrir trades. - BEAR si
EMA50 < EMA200→ standby total, no abre nuevas posiciones (sólo gestiona abiertas).
2. Condiciones de entrada BUY (todas deben cumplirse)
- Régimen
BULL Z-Score < -1.5(precio anormalmente bajo respecto a media móvil de 20 velas)RSI14 < 35(sobreventa)
3. Sizing y gestión de riesgo
- Riesgo por trade: 1% del balance disponible
- Stop Loss:
entrada − 2 × ATR14 - Position size = riesgo / (entrada − SL), tope al 50% del balance
4. Salidas (Take Profit doble)
- TP1: precio toca
entrada + 1.5 × ATR14→ cierra 60%, mueve SL a breakeven. - TP2: cuando
Z-Score ≥ 0(precio vuelve a la media) → cierra el 40% restante. - SL: si el precio toca el stop antes que TP1, cierra el 100%.
5. Parámetros activos actualmente
⚙️ Arquitectura de workflows
El sistema corre 2 workflows productivos en n8n + 1 readonly para este dashboard:
Trading Bot — flujo de 21 nodos
┌───────────────┐ GET 200 velas 4h
│ Cron 4h ├─▶ Kraken OHLCV ─▶ Calcular Indicadores ─▶ Evaluar Señal
└───────────────┘ (XBTUSD 240m) (EMA50/200, RSI, ATR, Z-Score) │
▼
┌───── ¿Señal BUY? ─────┐
▼ TRUE ▼ FALSE
GET Wallet INSERT signal
Calcular Sizing (NO_SIGNAL/STANDBY)
INSERT signal BUY │
INSERT trade abierto ▼
UPDATE wallet (reserva) ─▶ GET posiciones abiertas
Telegram: nueva pos │
└────────────┬─────────┘
▼
Revisar vs precio actual
│
¿Cierre? (SL / TP1 / TP2)
│
▼ si cierre
UPDATE trade · UPDATE wallet
Telegram: cierre
Daily Analysis (Gemini/Claude) — fallando
Workflow secundario que cada día a las 09:00 UTC envía un resumen AI al Telegram. Lleva
5 días con error en el Code node Construir Contexto AI:
referencia a GET Métricas Hoy en una rama que aún no ejecutó. No afecta al trading;
sólo se pierde el reporte diario.
🗄️ Schema de la base de datos
4 tablas en PostgreSQL trading_bot dentro del contenedor postgres-t8sw4kggs0gg8cc840k8gk0g.
trades
- id, created_at, pair, mode
- regime, entry_price, exit_price
- position_size_usd, stop_loss, tp1
- tp1_hit, tp1_hit_at, tp1_exit_price
- tp1_size_usd, remaining_size_usd
- trailing_stop, exit_reason
- pnl_usd, pnl_pct, trade_duration_hours
- z_score_entry, rsi_entry, atr_entry
- ema50_entry, ema200_entry
- status (open/partial/closed)
signals
- id, detected_at, pair
- price, z_score, rsi, atr
- ema50, ema200, regime
- signal_type (BUY / STANDBY / NO_SIGNAL)
- trade_opened (bool)
- trade_id (FK → trades)
paper_wallet
- id, updated_at
- balance_usd, initial_balance
- total_trades, winning_trades, losing_trades
- total_pnl_usd, peak_balance
- max_drawdown_pct, current_drawdown_pct
strategy_params
- id, updated_at
- z_score_threshold, rsi_threshold
- atr_sl_multiplier, atr_tp1_multiplier
- ema_short, ema_long
- risk_per_trade_pct, tp1_close_pct
- change_reason, approved_by
✅ Pruebas de funcionamiento — cómo verificarlo tú mismo
1. Datos en vivo desde n8n
El dashboard llama al webhook GET https://n8n.gusmes.com/webhook/trading-bot/data.
Puedes pegar esa URL en otra pestaña y ver el JSON crudo.
Última carga: —
2. Conexión real a PostgreSQL
Comando que reproduce los mismos números desde el VPS:
docker exec postgres-t8sw4kggs0gg8cc840k8gk0g \ psql -U postgres -d trading_bot \ -c "SELECT balance_usd, total_trades, winning_trades, total_pnl_usd FROM paper_wallet;"
3. Workflow Trading Bot ejecutándose cada 4h
Las últimas ejecuciones exitosas del bot principal (link al log de cada una):
- —
Próximo disparo del cron: —
4. Precio actual de Kraken (fuente de datos del bot)
El bot lee la misma URL pública sin autenticación:
curl -s "https://api.kraken.com/0/public/Ticker?pair=XBTUSD" | jq '.result'
5. Auditoría de movimientos en wallet (cada trade dejó huella)
docker exec postgres-t8sw4kggs0gg8cc840k8gk0g \ psql -U postgres -d trading_bot \ -c "SELECT id, entry_price, exit_price, position_size_usd, exit_reason, pnl_usd, status FROM trades ORDER BY id;"
6. Verificar que es 100% read-only
El workflow del dashboard sólo ejecuta SELECT y un json_build_object. No tiene
INSERT, UPDATE, DELETE. Inspecciona el código en
n8n.gusmes.com/workflow/PAvKiTp0DivnsZyv.