Ciclo de vida de los insights
AQE realiza el seguimiento de los insights mediante una máquina de estados que incluye:
NewExecutedFilledClosedCancelledRejected
Algunas rutas habituales son:
New -> Executed -> Filled -> ClosedNew -> RejectedExecuted -> CancelledFilled -> Closed
La caducidad, los fallos de pipes, los rechazos del bróker y las actualizaciones de operaciones contribuyen a esas transiciones.
Modificar una entrada sin ejecutar
Sección titulada «Modificar una entrada sin ejecutar»Un insight Executed ya se ha enviado, pero su orden de entrada puede seguir esperando a ejecutarse. Mientras no se haya ejecutado, un pipe u otra ruta de ejecución con &mut Insight puede modificar el precio de entrada:
| Método | Cambios | Orden pendiente aplicable |
|---|---|---|
insight.update_limit(ctx, price) | El precio límite de entrada | Limit o StopLimit |
insight.update_stop_limit(ctx, price) | El precio de activación de la orden stop de entrada | Stop o StopLimit |
Para una entrada StopLimit, estos son componentes de precio independientes. update_stop_limit no cambia el stop-loss de protección; usa update_stop_loss para eso. Del mismo modo, update_limit no cambia el take-profit.
InsightPipeResult::from_mutation(insight.update_limit(ctx, 101.0), self.name())Esta es una expresión de retorno dentro de un método InsightPipe::run dirigido a InsightState::Executed. Sustituye update_limit por update_stop_limit al modificar el precio de activación de la entrada. Usa from_mutation para que el pipe espere al comando del bróker en lugar de dar por completada una modificación que sigue en cola.
Antes del envío, cualquiera de los métodos establece localmente el precio correspondiente en un insight New. Para una entrada enviada, el precio debe ser finito y positivo, el tipo de orden debe coincidir, debe conocerse el ID de la orden del bróker y este debe declarar AmendLimitPrice o AmendStopPrice, respectivamente. El nuevo precio se registra después de que se confirme la modificación. Una vez que una entrada se ha ejecutado, aunque sea parcialmente, o ha quedado inactiva, el método deja el precio de entrada sin cambios y registra un mensaje en el historial de estados. Un bróker que no admita modificaciones de entrada devuelve un error para una orden pendiente activa.
Consulta Brókeres y fuentes de datos para la operación correspondiente del adaptador del bróker.
Campos de tiempo de vida
Sección titulada «Campos de tiempo de vida»AQE admite dos controles importantes del ciclo de vida:
period_unfilledse aplica mientras el insight sigue enNewoExecuted. Los insights caducados se rechazan o se solicita su cancelación, según el estado.period_till_tpse aplica una vez que el insight está enFilled. La caducidad puede activar una solicitud de cierre.
Estas comprobaciones las aplica el entorno de ejecución, no la interfaz.
Historial de estados
Sección titulada «Historial de estados»Cada cambio significativo puede registrarse en state_history, incluidos:
- transiciones de estado
- envío
- aceptación del bróker
- ejecuciones de órdenes
- cierres parciales
- solicitudes de cancelación
- rechazos
- gestión de la caducidad
Gracias a ese historial, el inspector compartido de AQS y Backtest Results resulta útil para revisar las operaciones.
Añadir un mensaje de historial personalizado
Sección titulada «Añadir un mensaje de historial personalizado»Usa state_log(...) cuando quieras adjuntar una nota de revisión a un insight sin cambiar su estado en el ciclo de vida. El hook de estrategia recibe los insights por referencia compartida, así que añade estos mensajes desde un pipe u otra ruta de ejecución que tenga &mut Insight.
use aq_engine::core::insight::{types::InsightState, Insight};use aq_engine::core::pipeline::{InsightPipe, InsightPipeBuilder, InsightPipeResult};use aq_engine::core::strategy::StrategyContext;
pub struct ReviewNotePipe;
impl InsightPipe for ReviewNotePipe { fn version(&self) -> &str { "1.0" }
fn run(&mut self, _ctx: &mut dyn StrategyContext, insight: &mut Insight) -> InsightPipeResult { insight.state_log(Some("Risk check passed".to_string()));
InsightPipeResult::new( true, true, Some("Review note added to insight history".to_string()), self.name().to_string(), ) }}Registra el pipe en el estado en el que quieras añadir la nota:
ctx.add_pipe( InsightPipeBuilder::new(Box::new(ReviewNotePipe)) .target_state(InsightState::Filled) .build(),);state_log(...) mantiene el estado actual, actualiza updated_at y añade el mensaje proporcionado a state_history. Si pasas None, AQE registra "State log entry".
Persistencia
Sección titulada «Persistencia»Las instantáneas de insights incluyen campos de ejecución como filled_price, close_price, broker_realized_pnl, commission y swap. Las ejecuciones en vivo sincronizan esas instantáneas con AQS Cloud y los backtests las guardan en la base de datos local de resultados.
Usamos cookies y almacenamiento esenciales para el inicio de sesión, la seguridad de la cuenta, las preferencias de tema de color, este aviso y las métricas internas necesarias de PostHog sobre uso, calidad de las sesiones y fiabilidad. No usamos cookies publicitarias.
