Portafolio de trading en real

Cómo las estrategias operan con dinero real: montos en dólares, conciliación automática, cierre total y el kill switch.

Última actualización 2026-08

Resumen

El portafolio de trading es el conjunto de estrategias autorizadas a colocar órdenes reales. Cada estrategia en él recibe un monto fijo en dólares; el daemon conciliador mantiene entonces las posiciones que las propias estrategias abrieron convergiendo hacia el objetivo combinado — tú nunca colocas estas órdenes. Solo gestiona sus propias órdenes: una posición que abriste a mano es invisible para él y nunca se toca.

strategy.py ──► state.json ──────────────┐
   (cron)                                ├──► reconciler.py ──► exchange
amounts     ──► portfolio_config.json ───┘

Dimensionamiento por monto

A cada estrategia del portafolio se le asigna un monto en la moneda de la cuenta (p. ej. USD) — con lo que opera la estrategia cuando su señal está a tamaño completo. La posición objetivo por símbolo es la suma entre estrategias:

target[symbol] = Σ ( amount × position )

position es la señal de la estrategia y puede ser fraccionaria (una estrategia escalada por volatilidad puede emitir 0.5 o 1.8). El monto que configuras es exactamente lo que dimensiona las posiciones — no varía con el capital de la cuenta. Excepción: para las estrategias de futuros de Taiwán de Capital (群益), el monto es un número de lotes (cantidad de contratos), no una cifra en dólares.

Nunca edites manager/portfolio_config.json a mano. Configura los montos desde la página Configuración de trading del espacio de trabajo o pídeselo al agente; los pesos del optimizador se aplican solo a través de manager.py, que por defecto es dry-run y solo escribe la configuración con --apply tras tu confirmación.

El conciliador

El conciliador es un daemon que consulta cada 5 segundos y concilia cuando:

  • una estrategia actualiza su señal (cambia state.json)
  • guardas nuevos montos en Configuración de trading
  • se activa o se desactiva el kill switch
  • pasan 5 minutos sin conciliar — una red de seguridad que detecta la desviación de posiciones y claves de exchange muertas
  • termina una ejecución TWAP o personalizada — así la brecha residual converge en una sola consulta en lugar de esperar la red de seguridad de 5 minutos

Cada pasada compara el objetivo contra el libro propio del bot — el conciliador mantiene su propio registro, un total acumulado de cada orden que ha colocado (manager/orders.jsonl), en lugar de leer las posiciones brutas de la cuenta en el exchange, de modo que una posición que abriste a mano nunca se lee como "ya en cartera" ni se añade ni se cierra. Luego se colocan órdenes para cerrar la brecha — órdenes a mercado por defecto; cada estrategia puede configurarse como mercado, TWAP, chase limit o un estilo de ejecución personalizado en Configuración de trading (los futuros TW de Capital (群益) solo admiten mercado). Las diferencias menores a $10 se ignoran (los futuros TW concilian en lotes completos en su lugar). Un giro de posición (largo → corto) se divide en un cierre reduce-only más una apertura nueva, para que las cuentas en modo hedge nunca mantengan ambos lados a la vez.

Cuando no se pueden leer las posiciones del exchange: una falla temporal del exchange (timeout, saturación, mantenimiento) solo salta esas rondas y el trading se reanuda solo cuando la lectura vuelve; tras 30 minutos seguidos sin conexión, te avisamos. El conciliador activa el kill switch solo ante una clave inválida, permisos insuficientes, una IP fuera de la lista blanca, 3 errores no reconocidos seguidos, o una cuenta que no coincide al arrancar, al recuperar la conexión o al cambiar la clave — y ese kill switch nunca se desactiva solo; tú decides cuándo reanudar.

Cerrar todas las posiciones

Presiona Pausar trading en el espacio de trabajo y el diálogo ofrece dos opciones: Pausar nuevas posiciones solo activa el kill switch; Pausar y cerrar posiciones (o python3 manager/flatten.py) cierra a mercado las posiciones que abrieron las estrategias — solo lo que está en el libro propio del bot, así que una posición que abriste a mano queda intacta, y en spot solo vende las monedas bajo gestión de la estrategia, nunca tus otras tenencias. Es un botón de pánico, no gestión de portafolio:

  • Primero se activa el kill switch, así que nada se vuelve a abrir después del cierre total — el trading permanece pausado hasta que presiones Iniciar trading.
  • Las posiciones por debajo del mínimo del exchange no se pueden cerrar — el dust queda registrado y sin cerrar.
  • Cada cierre se registra en el historial de órdenes con su ejecución confirmada por el exchange.

Kill switch (HALT)

Mientras el kill switch está activo, cualquier orden que aumente la exposición se rechaza a nivel de código. Cerrar posiciones, stop-loss / take-profit y cancelaciones sí se procesan — un halt nunca atrapa una posición que estás intentando reducir.

Se activa con Pausar trading en el espacio de trabajo (incluido Pausar y cerrar posiciones), diciéndole al agente que detenga el trading, o automáticamente ante un error de clave o permisos, 3 errores no reconocidos seguidos, o una cuenta que no coincide al arrancar, al recuperar la conexión o al cambiar la clave (una falla temporal del exchange no lo activa — el trading se reanuda solo cuando vuelve). Nunca se desactiva automáticamente — el trading se reanuda solo cuando presionas Iniciar trading o le pides explícitamente al agente que reanude. Iniciar trading también ofrece dos opciones: Iniciar y ponerse al día con las posiciones coloca órdenes a mercado de inmediato para igualar la señal actual de cada estrategia; Iniciar, esperar nuevas señales no coloca órdenes ahora — cada estrategia empieza a operar solo en su próxima entrada, salida o giro. Cada intento de orden y cada rechazo se registran en un log de auditoría.

Historial de órdenes y ejecuciones

Cada orden ejecutada se agrega a manager/orders.jsonl con sus tramos — el precio de ejecución confirmado por el exchange y la cantidad ejecutada de cada tramo individual. Un giro de posición registra dos tramos: el tramo de cierre lleva el precio de salida, el tramo de apertura el precio de entrada.

Los fallos parciales también se registran: si el tramo de cierre de un giro se ejecutó pero el tramo de apertura falló, la entrada se conserva y se marca como fallida — el historial nunca oculta una orden que movió dinero real. La pestaña Historial de órdenes del espacio de trabajo muestra este archivo.