Cómo las estrategias operan con dinero real: montos en dólares, conciliación automática, cierre total y el kill switch.
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 ───┘
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.
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 es un daemon que consulta cada 5 segundos y concilia cuando:
state.json)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.
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:
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.
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.