Aller au contenu

Insights

Un insight est l’unité d’intention de trading d’AQE. Il commence comme trade candidat et peut passer par la soumission, l’exécution, les fills, les clôtures partielles et la clôture finale tout en conservant un historique d’état qu’AQS peut inspecter ensuite.

Les champs principaux incluent :

  • symbole
  • side
  • confiance
  • timeframe
  • lignée parent/enfant
  • quantité
  • structure d’entrée
  • niveaux de take-profit et stop-loss
  • écart de trailing stop
  • prix de fill et de clôture
  • historique d’état
aq-engine/src/core/insight/insight.rs
pub struct Insight {
pub insight_id: Uuid,
pub parent_id: Option<Uuid>,
pub state: InsightState,
pub children: Vec<Insight>,
pub order_id: Option<String>,
pub side: OrderSide,
pub symbol: String,
pub quantity: Option<f64>,
pub order_type: OrderType,
pub order_class: OrderClass,
pub limit_price: Option<f64>,
pub stop_price: Option<f64>,
pub take_profit_levels: Option<Vec<f64>>,
pub stop_loss_levels: Option<Vec<f64>>,
pub trailing_stop_price: Option<f64>,
pub filled_price: Option<f64>,
pub close_price: Option<f64>,
pub partial_closes: Vec<PartialCloseResult>,
pub state_history: Vec<(DateTime<Utc>, InsightState, Option<String>)>,
}

AQE suit les insights via une machine d’état qui inclut :

  • New
  • Executed
  • Filled
  • Closed
  • Cancelled
  • Rejected

Les chemins typiques ressemblent à :

  • New -> Executed -> Filled -> Closed
  • New -> Rejected
  • Executed -> Cancelled
  • Filled -> Closed

L’expiration, les échecs de pipes, les rejets courtier et les mises à jour de trade alimentent ces transitions.

Le pattern utilisateur le plus courant est :

let mut insight = Insight::new(
OrderSide::Buy,
"AAPL".to_string(),
StrategyType::Testing,
ctx.timeframe().clone(),
80,
None,
);
insight
.set_limit_price(Some(200.0))
.set_take_profit_levels(Some(vec![206.0]))
.set_stop_loss(Some(197.5))
.set_period_unfilled(Some(5))
.set_period_till_tp(Some(12));
ctx.add_insight(insight);

À partir de là, le pipeline d’insights peut ajouter le sizing, les validations ou le comportement de soumission.

AQE prend en charge les insights enfants directement sur le modèle d’insight principal. Un insight parent peut attacher un ou plusieurs insights enfants et préserver cette relation dans le runtime et le modèle de snapshot.

aq-engine/src/core/insight/insight.rs
pub fn add_child_insight(
&mut self,
mut child_insight: Insight,
_ctx: &mut dyn StrategyContext,
) -> &mut Self {
child_insight.strategy_type =
StrategyType::Custom(format!("{}-CHILD", self.strategy_type.to_string()));
child_insight.parent_id = Some(self.insight_id);
if child_insight.quantity.is_none() {
child_insight.quantity = self.quantity;
}
let child_id = child_insight.insight_id;
self.children.push(child_insight);
self.update_state(
self.state.clone(),
Some(format!("Added child insight: {:?}", child_id)),
);
self
}

Cela donne deux capacités importantes :

  • lignée : les insights enfants restent connectés au parent original via parent_id
  • soumission différée : AQE peut mettre les insights enfants en file et les soumettre au bon moment dans la boucle runtime

Les cas d’usage typiques incluent :

  • entrées échelonnées
  • signaux de suivi dérivés d’un fill parent
  • plans de trade multi-étapes nécessitant une trace d’inspection liée

AQE prend en charge deux contrôles de cycle de vie importants :

  • period_unfilled
    • s’applique quand l’insight est encore New ou Executed
    • les insights expirés sont rejetés ou une annulation est demandée selon l’état
  • period_till_tp
    • s’applique une fois que l’insight est Filled
    • l’expiration peut déclencher une demande de clôture

Ces vérifications sont appliquées par le runtime, pas par l’UI.

Chaque changement significatif peut être enregistré dans state_history, notamment :

  • transitions d’état
  • soumission
  • acceptation courtier
  • fills
  • clôtures partielles
  • demandes d’annulation
  • rejets
  • gestion de l’expiration

Cet historique rend l’inspecteur partagé dans AQS et Backtest Results utile pour la revue.

L’insight stocke la configuration que vous définissez, mais le courtier possède les jambes d’exécution réelles :

  • jambes take profit
  • jambes stop loss
  • jambes trailing stop

Par exemple, un trailing stop est défini sur l’insight comme un écart float, tandis que le courtier crée et gère la vraie jambe de trailing stop pendant l’exécution.

Les insights peuvent enregistrer des résultats de clôture partielle au fil du temps. C’est important pour :

  • les stratégies scale-out
  • les sorties multi-cibles
  • une inspection précise dans AQS et la revue de backtest

Si une stratégie utilise plus d’un niveau de take-profit, AQE peut clôturer une partie de la quantité tout en laissant la position restante ouverte.

Les insights enfants et les clôtures partielles résolvent des problèmes différents :

  • les clôtures partielles gardent un insight ouvert tout en réduisant la taille au fil du temps
  • les insights enfants créent des insights liés séparés avec leur propre cycle de vie
  • aq-engine/src/core/insight/insight.rs
  • aq-engine/src/core/insight/snapshot.rs
  • aq-engine/src/core/strategy/mod.rs