Ir al contenido

Modelos de universo

Un modelo de universo es un selector modular de símbolos. Devuelve símbolos mediante 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 combina los símbolos devueltos por Strategy::universe(ctx) y todos los modelos de universo registrados. El universo final es una unión sin duplicados. Esto significa que un universo estático puede seguir definido directamente en la estrategia mientras uno o más modelos de universo añaden símbolos a partir de listas de seguimiento, filtros, reglas de cuenta o lógica de selección que tenga en cuenta la fecha.

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())
}
}

Sigue siendo válido escribir el código del ciclo de vida directamente en la estrategia:

  • coloca el registro sencillo de arranque en Strategy::on_start
  • coloca la configuración sencilla por activo en Strategy::init
  • devuelve un conjunto fijo de símbolos desde Strategy::universe
  • coloca la limpieza puntual en Strategy::on_teardown

Usa preferentemente modelos de universo cuando la selección de símbolos pertenezca claramente a un módulo, necesite configuración de constructor o deba reutilizarse entre estrategias.