Aller au contenu

Universe models

Un universe model est un sélecteur de symboles modulaire. Il retourne des symboles via UniverseResult :

aq-engine/src/core/universe/mod.rs
pub trait UniverseModel {
fn version(&self) -> &str;
fn run(&mut self, ctx: &mut dyn StrategyContext) -> UniverseResult;
}

AQE fusionne les symboles retournés par Strategy::universe(ctx) et par chaque universe model enregistré. L’univers final est une union dédoublonnée. Cela permet de garder un univers statique inline tout en ajoutant des symboles depuis des watchlists, filtres, règles de compte ou sélections dépendant de la date.

state.add_universe_model(
UniverseModelBuilder::new(Box::new(MyUniverseModel::new()))
.can_fail(false)
.build(),
);
use aq_engine::core::strategy::StrategyContext;
use aq_engine::core::universe::{UniverseModel, UniverseResult};
use std::collections::HashSet;
pub struct CryptoMajors;
impl CryptoMajors {
pub fn new() -> Self {
Self
}
}
impl UniverseModel for CryptoMajors {
fn version(&self) -> &str {
"1.0"
}
fn run(&mut self, _ctx: &mut dyn StrategyContext) -> UniverseResult {
let symbols = ["BTCUSD", "ETHUSD"]
.into_iter()
.map(str::to_string)
.collect::<HashSet<_>>();
UniverseResult::passed(symbols, self.name().to_string())
}
}

Le code inline reste valide :

  • mettez la configuration simple dans Strategy::on_start
  • mettez l’initialisation par actif dans Strategy::init
  • retournez un ensemble fixe depuis Strategy::universe
  • placez le nettoyage ponctuel dans Strategy::on_teardown

Préférez les universe models quand la sélection de symboles a une frontière de module claire, a besoin d’une configuration de constructeur ou doit être réutilisée entre stratégies.