Panel de control 📊
Lo primero que ves cuando inicia sesión, y honestamente la página que dejarás abierta todo el día. La
página de aterrizaje (/, Components/Pages/Index.razor) es un centro de comando en vivo, optimizado para dispositivos móviles para la actividad del usuario
inició sesión en ejecuciones de cBot, backtests, recursos y (para administradores) el clúster de nodos. Se actualiza automáticamente, se ve bien en un teléfono, y nunca te hace presionar F5.
Qué muestra
De arriba a abajo, ordenado por prioridad para un teléfono (cada bloque es un elemento de pila de ancho completo en dispositivos móviles, una cuadrícula responsiva en tablet/escritorio):
- Encabezado — título, un indicador en vivo (un punto pulsante real; estático bajo
prefers-reduced-motion), el tiempo de última actualización, y un selector de período (1H · 24H · 7D · 30D) que controla los KPIs y gráfico. - KPIs héroe — cuatro tarjetas fáciles de leer, cada una con un número grande + un minigrá SVG en línea, y (donde
es significativo) un delta vs el período anterior:
- Activo ahora — ejecuciones + backtests que se están iniciando/ejecutando actualmente.
- Tasa de éxito — completados ÷ (completados + fallidos) durante el período; delta en puntos porcentuales.
- Completados — ejecuciones/backtests terminados este período; delta vs período anterior.
- Fallidos — fallos este período; delta (menos es mejor, por lo que una caída muestra verde).
- Gráfico de actividad — una línea de tiempo de área ApexCharts de iniciados / completados / fallidos por intervalo de tiempo.
- Anillo de estado de instancia — una dona de en ejecución / backtests / pendiente / completado / fallido, total en el centro.
- Backtests — un resumen de tres tiles (en ejecución / completados / fallidos), clic para ir a
/backtest. - Copia de trading — tus perfiles de copia de trading con un punto de estado en vivo, contador de destinos, y un distintivo En vivo
en perfiles en ejecución; clic para ir a
/copy-trading. - Agentes de IA — tus agentes de trading impulsados por personajes con estado de ejecución (arquetipo · estado) y hora de la última acción;
clic para ir a
/agent-studio. - Feed de actividad en vivo — los 20 eventos más recientes (más nuevos primero) con un punto de color de estado y marca de tiempo relativa.
- Salud del clúster (solo administradores) — nodos activos vs totales y un indicador de capacidad en uso.
- Tiles de recursos — cBots, cuentas de trading, IDs de cTrader, claves de MCP (clic para ir a sus páginas).
Personaliza tu panel de control
Cada bloque anterior es un widget que controlas. Presiona Personalizar (arriba a la derecha del encabezado) para abrir un diálogo donde muestras/ocultas cualquier widget y reordenas con flechas arriba/abajo. Restablecer a predeterminado restaura el orden del catálogo. Tu elección se persiste del lado del servidor por usuario, por lo que te sigue en todos navegadores y dispositivos — no solo esta pestaña.
- Los widgets controlados por características y solo para administradores (Copia de trading, Agentes de IA, Salud del clúster) solo aparecen en el diálogo cuando tu implementación/rol puede usarlos.
- El catálogo de widgets es una única fuente de verdad en
Core/Dashboard/DashboardWidgets.cs; la presentación (etiqueta + icono + disponibilidad) vive enComponents/Dashboard/DashboardWidgetMeta.cs.
Cómo se mantiene en vivo
La página sondea GET /api/dashboard/overview?period=<1h|24h|7d|30d> cada 10 segundos y vuelve a renderizar los
widgets en su lugar — sin recarga manual. Una falla de obtención transitoria se ignora y se reintentar en el siguiente ciclo;
el bucle se detiene limpiamente al desechar. La primera carga muestra un esqueleto; una falla persistente muestra una tarjeta de error con Reintentar; un usuario sin datos ve KPIs en cero y copia de estado vacío.
Backend
Endpoints/DashboardEndpoints.csasigna/overview(y mantiene el/statsescalar anterior). Es por usuario y controlado por administrador a través deICurrentUser; el reloj proviene deTimeProvider. También asignaGET/PUT /api/dashboard/layout— el diseño de widget del usuario, cargado al iniciar la página y guardado desde el diálogo Personalizar.- Persistencia de diseño es el agregado
UserDashboard(Core/Dashboard/UserDashboard.cs): un panel por usuario (único enUserId), siendo propietario de una lista ordenada de configuraciones de widget (visible + orden) almacenadas como una columnajsonb. La lista ordenada solo se muta a través deApply/Reset, que valida cada clave contra el catálogoDashboardWidgetsy mantiene la colección completa y deduplicada. Las claves desconocidas se rechazan con unaDomainException→400. Endpoints/DashboardQuery.cscrea el modelo de lectura compuestoDashboardOverview: una instantánea de estado en todo momento (conteos agrupados), un conjunto ventanado de instancias materializadas una sola vez, y conteos de recursos/nodos. El estado de la instancia y las marcas de tiempo terminales viven en subtipos TPH (no columnas), por lo que las filas se leen en memoria a través de los ayudantes compartidosInstanceEndpoints.GetStartedAt/GetStoppedAt. Tiempo de evento =stopped ?? started ?? created.Endpoints/DashboardModels.cscontiene los DTOs, el plan período→(ventana, conteo de intervalos), yDashboardMath— puro, determinístico agrupamiento + matemáticas de KPI/delta (sin I/O,nowse pasa).
Los deltas de KPI comparan la ventana actual contra la inmediatamente anterior (la consulta obtiene una ventana doble para esto). No hay un feed de P&L de cuenta en vivo — la plataforma solo tiene equidad para backtests y seguimiento de empresas prop — por lo que el panel de control es deliberadamente operativo (actividad, rendimiento, tasa de éxito), no un ticker de saldo de correduría.
Diseño y fichas
Todo color proviene de fichas de diseño (var(--app-success|-warning|-error|-info|-primary|-text*)), por lo que una
paleta etiquetada en blanco fluye gratis — incluyendo el gráfico, cuyas colores de series se leen desde las
fichas resueltas en tiempo de ejecución a través de window.appReadTokens (SVG no puede consumir variables CSS directamente). Sin
números hexadecimales codificados en ninguna parte del panel de control. Véase ../ui-guidelines.md.
El enlace "Impulsado por cMind"
El panel de control muestra un pequeño y elegante enlace "Impulsado por cMind" que apunta a este sitio de documentación.
Se muestra de forma predeterminada — estamos orgullosos del proyecto y ayuda a otros operadores a encontrarlo — pero
es completamente tu decisión. Los revendedores que ejecutan una instancia completamente etiquetada en blanco establecen
App:Branding:ShowSiteLink a false y desaparece. Véase
Marca de etiqueta blanca.
Pruebas
- Estilo unitario (
tests/IntegrationTests/DashboardMathTests.cs) — agrupamiento, tasa de éxito, deltas de período anterior, análisis de período, vacío/límites (evento ennow, guardia de división por cero). - Unidad (
tests/UnitTests/Dashboard/UserDashboardTests.cs) — el agregadoUserDashboard: semilla predeterminada, aplicar orden/visibilidad, anexo omitido, colapso duplicado, rechazo de clave desconocida, reinicio. - Integración (
tests/IntegrationTests/DashboardQueryTests.cs,DashboardLayoutTests.cs) — el modelo de lectura contra Postgres real (estado/KPIs/actividad/recursos, salud del nodo de administrador, ruta de usuario vacía), las nuevas secciones de backtests/perfiles de copia/agentes, y un viaje de ida y vuelta de diseño (guardar diseño personalizado → recargar → orden + visibilidad persistentes). - E2E (
tests/E2ETests/DashboardTests.cs,DashboardCustomizeTests.cs) — escritorio + móvil: tarjetas de KPI, gráfico, anillo y feed se renderizan; el selector de período cambia el período activo y recarga; un KPI profundiza en/run; ocultar un widget persiste en toda recarga, Reiniciar lo trae de vuelta, y el diálogo Personalizar funciona en un teléfono sin desbordamiento horizontal./también está enPageSmokeTests,MobileLayoutTests(shell + sin desbordamiento) yMobileJourneyTests.